简介
MySQL的查询缓存是MySQL内置的一种缓存机制,可以针对sql进行缓存。比如我们发送select * from mysql.user这么一个查询,MySQL首先检索内存中是否有数据并且数据是否过期,如果没有数据或者数据已经过期就去数据库中查找,如果有数据并且没有过期就直接返回数据。对于sql的匹配规则非常简单,就是字符串的比较,只要字符串相同,那么就认为是同一个查询。这里的字符串相同并不是表示sql语义相同,而是查询的sql字符串相同,空格也不行。
查询缓存配置
查询缓存的开启在my.cnf配置文件中,修改查询缓存相关参数就可以完成。(RDS在管理后台进行配置)
参数解释
query_caceh_type | 是否开启查询缓存 0 表示不开启查询缓存 |
query_cache_size | 给缓存分配的最大内存空间 |
query_cache_limit | 指定单个查询能够使用的缓存大小 |
query_cache_wlock_invalidate | 针对myisam存储引擎(所以采用非myisam引擎的就不需要考虑了),设置当有write lock在某个table上面的时候,读请求是要等待write lock释放资源之后再查询还是允许直接从query cache中读取结果,默认是OFF,可以直接从query cache中取得结果。 |
查看缓存状态
我们可以使用 show global status like 'Qcache%'; 来查看查询缓存的使用状态。
参数解释
Qcache_free_blocks | 目前还处于空闲状态的 Query Cache 中内存 Block 数目 |
Qcache_free_memory | 目前还处于空闲状态的 Query Cache 内存总量 |
Qcache_hits | 命中次数 |
Qcache_inserts | 向 Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数 |
Qcache_lowmem_prunes | 当 Query Cache 内存容量不够,需要从中删除老的 Query Cache 以给新的 Cache 对象使用的次数 |
Qcache_not_cached | 没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL |
Qcache_queries_in_cache | 目前在 Query Cache 中的 SQL 数量 |
Qcache_total_blocks | Query Cache 中总的 Block 数量 |
单句SQL缓存
配置文件的query_caceh_type参数有三个选项。
其中0 表示不开启查询缓存,也就是说任何SQL都无法使用查询缓存。
1 表示始终开启查询缓存,也就是说所有的SQL都会被缓存。当我们认为某一项业务的SQL会频繁变化(例如利用用户坐标排序),那么我们可以使用sql_no_cache指定此SQL不进入缓存,从而减少性能开销。例如:select sql_no_cache * from user;
2 表示按需开启查询缓存,也就是说所有的SQL在不指定情况下都不会被缓存。只有使用sql_cache的SQL才会被缓存。例如:select sql_cache * from user;