1.当前表的查询缓存状态查询:
SHOW VARIABLES LIKE '%query_cache%';
2.sql语句会从查询缓存读条件:
sql完全一致:即使多一个空格或者大小写不同都认为不同;如果使用不同的字符集、不同的协议等也会被认为是不同的查询而分别进行缓存。
3.查看查询缓存命中次数:
SHOW STATUS LIKE 'Qcache_hits';
4.查询缓存失效:
在表的结构或数据发生改变时,查询缓存中的数据不再有效。有这些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE会导致缓存数据失效。所以查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用。
5.保存至查询缓存:
缓存会在内存中开辟一块内存(query_cache_size)来维护缓存数据,其中有大概40K的空间是用来维护缓存的元数据的(什么是元数据:http://www.cnblogs.com/Alight/p/3982086.html),例如空间内存,数据表和查询结果的映射,SQL和查询结果的映射等.
保存图示:
6.查询缓存缺点:
1.查询缓存需要占用一定的内存;2.每次查询执行前都要先检查缓存,故不一定有利;
7.调优:
1.如果需要缓存的查询很少,可以将query_cache_type设置为demand,然后对需要缓存的查询后面添加sql_cache。
2.如果写入操作很多,这个时候可以禁用缓存,并将缓存大小query_cache_size设置为0,这样就不会占用内存。
3.如果写操作存在,也想用查询缓存,那么就让写操作成批量的执行,而不是逐个执行。
8.具体情况分析:
衡量打开缓存是否对系统有性能提升是一个很难的话题
1. 通过缓存命中率判断, 缓存命中率 = 缓存命中次数 (Qcache_hits) / 查询次数 (Com_select)
2. 通过缓存写入率, 写入率 = 缓存写入次数 (Qcache_inserts) / 查询次数 (Qcache_inserts)
3. 通过 命中-写入率 判断, 比率 = 命中次数 (Qcache_hits) / 写入次数 (Qcache_inserts), 高性能MySQL中称之为比较能反映性能提升的指数,一般来说达到3:1则算是查询缓存有效,而最好能够达到10:1
9.缓存查询分析步骤: