MySQL查询缓存的优化

设置缓存的服务器变量

变量 含义
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数量

三个重要指标的计算

  1. 缓存中内存块的最小分配单位(query_cache_min_res_unit)
    (query_chche_size - Qcache_free_memory) / Qcache_queries_in_cache
  2. 缓存命中率
    Qcache_hits / (Qcache_hits + Qcache_inserts) * 100%
  3. 缓存内存使用率
    (query_cache_size - Qcache_free_memory) / query_cache_size * 100%

优化的过程

mysql缓存优化.png

不能被缓存的查询

  • 查询语句中加了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格式,增加缓存的命中率

你可能感兴趣的:(MySQL查询缓存的优化)