MySQL Query Cache
A Practical Look at the MySQL Query Cache
http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html
数据库缓存策略:
(1)缓存经常被使用的数据
(2)缓存经常执行的SQL和存储过程代码
(3)缓存数据库元数据信息,包括:对象结构缓存、安全信息等
mysql引擎所使用的缓存:
(1)myisam:key buffer
(2)innodb:data + index buffer
(3)memory:data + index buffer
不是Cache Hit Ratio越高越好,假如:
A和B是不同的SQL语句,有不同的执行计划,但返回相同的结果集,并且A的数据库的缓存较大
SQL
Cache Hit Ratio
Logical I/O
Physical I/O
Time
A
99.99%
10000
1
0.405secs
B
90.00%
10
1
0.005secs
因为逻辑I/O会对内存进行锁操作来从内存建立结果集,这会造成许多CPU活动。
相关的参数:
(1)query_cache_type ON|DEMAND|OFF
ON时,不缓存有SQL_NO_CACHE的SELECT
DEMAND时,只缓存SQL_CACHE的SELECT
(2)query_cache_size 查询缓存的大小;0时,是关闭查询缓存
(3)query_cache_limit 指示每个查询结果集最大的缓存限制,超过这个值的结果集不缓存
(4)query_alloc_block_size 缓存分配的块大小
(5)query_cache_min_res_unit 被分配给缓存的最小的块的数量
(6)query_cache_wlock_invalidate 被写锁无效化的查询缓存的数量
(7)query_prealloc_size 被缓存用于解析和执行的持久buffer的大小
相关的状态:
(1)Qcache_inserts:数据放入缓存的次数
(2)Qcache_hits:缓存命中的次数
(3)Qcache_free_blocks:缓存中自由的块数;如果此值很高,则指示了内存中有许多碎片,可以用flush query cache来解决这个问题
(4)Qcache_free_memory:自由缓存的大小
(5)Qcache_lowmem_prunes:指示有多少次mysql必须从查询缓存中移除条目,从而为了新进一次的查询
(6)Qcache_not_cached:不能够缓存的SQL结果集的数量
查询的限制:
(1)相同的查询可以被缓存服务
(2)任何DML语句,能够使相关于这个表的查询缓存无效
(3)多个函数,如:CURRENT_DATE,NOW,RAND用于查询中,则不被缓存
(4)使用用户定义的函数的查询不能被缓存
相关的命令:
set global
set session
show variables like 'query%'
show status l
相关文档:
MySQL 5.0 以上支持存储过程。
PHP 5.0 以上的 mysqli 系列函数可以支持操作 MySQL 的存储过程。
以下是一些简单的存储过程和用 PHP 调用的示例。 一、返回单个数据: 1: <?php
2: header("Content-Type:t ......
PHP中分页肯定会使用到MySQL的limit,大部分对类似"select * from title where uid =** order by id desc limit m,n"很熟悉,也不是全部都能看出里面有什么不对,可是当是在大数据量下操作呢,比如百万类似"select * from title where uid =177 order by id desc limit 1234567,20"就会发现sql执行的时间明 ......
触发器在mysql中应用的不多,它是在mysql5以上才开始支持的,不支持不代表它不重要,首先了解一下什么是触发器.触发器是在数据库中为响应一个特殊表格中的某些事件而自动执行的程序代码。(Wikipedia)说得简单一些,它是在一个特殊的数据库事件,如INSERT或DELETE发生时,自动激活的一段代码。触发器可方便地用于日志记录、对 ......
Another Look at MySQL 5.1's SQL Diagnostic Tools
http://dev.mysql.com/tech-resources/articles/mysql_51_diagnostic_tools.html 数据库的性能决定因素:
(1)数据库的设计
(2)SQL代码 可以用以下几种方法来解决一些性能问题:
(1)索引
(2)水平分区
(3)列适应的表
colum ......
最近,项目中用到mysql,由于数据量非常大,每天的数据量在百万级,考虑到mysql数据库处理性能以及数据属性,决定保存足够多的查询数据即可,距当前时间最久远的数据直接删除,无需进行备份。
头脑中冒出的第一个想法就是,能否利用mysql中的触发器,检查数据表大小,如果超过预设长度,则删除部分数据。
CREATE TRIGGER ......