以下内容都是来自马哥的分享,虽然都是收费的,但是值得一看(我绝不是拖啊!),涉及到的数据都是服务器的真实数据,可以自己做个计算还是挺有趣的!
查询缓存的参数说明(my.cnf
)
mysql> show global variables like "query_cache%";
Variable_name | Value | desc |
| 1048576 |
|
| 4096 |
|
| 33554432 |
|
| ON |
|
| OFF | 如果某个数据表被其它的链接锁住,是否仍然从查询缓存中返回结果。OFF表示返回 |
MySql运行产生的状态值
mysql> show global status like 'qcache%';
Variable_name | Value | desc |
Qcache_free_blocks | 1057 |
|
Qcache_free_memory | 21667632 | 没有被申请划分为数据块的部分 |
Qcache_hits | 2379301 | 缓存命中次数 |
Qcache_inserts | 412811 | 执行向缓存中插入缓存对象的次数 |
Qcache_lowmem_prunes | 0 |
|
Qcache_not_cached | 1248823 | 查询没被缓存的个数 |
Qcache_queries_in_cache | 1804 | 保存在缓存中的查询个数 |
Qcache_total_blocks | 5043 | 已经分配好的块个数 |
如何确定MySql中是否缓存了刚才执行的SQL语句
mysql中的缓存是 key-value hash
hash区分大小写
MySql那些东西不会被缓存
- 不确定性的内容
- 用户自定义函数
- 用户自定义变量
- 临时表
- mysql用的系统表
- 列级别的权限
- 存储函数
- 不确定数据
命中率估算
mysql> show global status where variable_name="Qcache_hits" or variable_name="Com_select";
Variable_name | Value |
Com_select | 1703848 |
Qcache_hits | 2421498 |
1. hits rate(命中率)
= Qcache_hits/(Qcache_hits+Com_select)
不过。这个未必能反应真实情况! 命中率>30%
就可以认为有效
2. 也应该经常查询另一个指标,命中和写入
的比率,即Qcache_hits
和Qcache_insert
的比值,次比例大于3:1
时通常查询缓存是有效的,能达到甚至大于10:1就更好了。
缓存整理操作
-
FLUSH QUERY_CACHE
, 命令可以用于完成碎片整理,但会导致服务器系统僵死一段时间 - 要清空缓存,可以使用
RESET QUERY_CACHE
通用缓存优化思路
- 批量写入而非单个写入,批量写入仅一次性影响缓存
- 过大的缓存空间会使的在大量缓存对象过期失效时导致服务器假死
- 必要时,使用
SQL_CACHE
和SQL_NO_CACHE
手动控制缓存动作。 - 对写密集型的场景来说,禁用缓存可以提高性能。
- 如果Qcache_lowmem_prunes 值比较大,表示查询缓存区大小设置太小,需要增大。