设置缓存的服务器变量
变量 |
含义 |
query_cache_min_res_unit |
查询缓存中内存块的最小分配单位,默认为4K |
query_cache_limit |
单个查询结果能缓存的最大值,默认为1M,对于查询结果过大而无法缓存的语句,建议使用sql_no_cache |
query_cache_size |
查询缓存总共可用的内存空间;单位为字节,必须是1024整数倍 |
query_cache_wlock_invalidate |
如果表被其它session锁定,是否可以从查询缓存中返回结果,默认值为off,on表示不允许 |
query_cache_type |
是否开启缓存功能,on,off,demand |
MySQL中于查询缓存相关的状态变量:
MariaDB [(none)]> show global status like 'Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16755560 |
| Qcache_hits | 2 |
| Qcache_inserts | 3 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 3 |
| Qcache_queries_in_cache | 3 |
| Qcache_total_blocks | 9 |
+-------------------------+----------+
其中各个状态变量的含义是:
状态变量 |
含义 |
Qcache_free_blocks |
处于空闲状态query cache中内存的block数量 |
Qcache_total_blocks |
query cache中总的block,当Qcache_free_blocks相对此值较大时,可能有内存碎片,执行FLUSH QUERY CACHE清理碎片
|
Qcache_free_memory |
处于空闲状态的query cache内存总量 |
Qcache_hits |
命中次数 |
Qcache_inserts |
向query cache中插入新的query cache的次数,即未命中的次数 |
Qcache_lowmem_prunes |
记录因为内存不足而被移出缓存的查询数 |
Qcache_not_cached |
没有被cache的sql数,包括无法被cache的sql以及由于query_cache_type设置的不会被cache的sql语句 |
Qcache_queries_in_cache |
在query cache中的sql数量 |
三个重要指标的计算
- 缓存中内存块的最小分配单位(query_cache_min_res_unit)
(query_chche_size - Qcache_free_memory) / Qcache_queries_in_cache
- 缓存命中率
Qcache_hits / (Qcache_hits + Qcache_inserts) * 100%
- 缓存内存使用率
(query_cache_size - Qcache_free_memory) / query_cache_size * 100%
优化的过程
不能被缓存的查询
- 查询语句中加了SQL_NO_CACHE参数
- 查询中含有获得值的函数,包括自定义函数,如NOW(), CURDATE(), GET_LOCK(), RAND(), CONVERT_TZ()等。
- 对系统数据库的查询:mysql,information_schema查询语句中使用SESSION级别变量或存储过程中的局部变量
- 查询语句中使用了LOCK IN SHARE MODE、FOR UPDATE的语句,查询语句中类似SELECT …INTO 导出数据的语句
- 对临时表的查询操作;存在警告信息的查询语句;不涉及任何表或视图的查询语句;某用户只有列级别权限的查询语句
- 事务隔离级别为Serializable时,所有查询语句都不能缓存
- 缓存命中采取hash值比较所以在编程中相同查询语句要使用相同的sql格式,增加缓存的命中率