1、缓存的优点
1、不需要对sql语句做任何的解析和执行,当然语法解析必须通过在先,直接从query cache中得到查询结果
2、查询缓存的判断规则,提高了查询缓存的使用门槛,降低效率
3、查询缓存的作用,会增加检查和清理query cache中记录的开销
2、缓存的过程
缓存SELECT操作会预处理查询结果集合SQL语句,当有新的SSELECT语句或者是预处理查询的请求过来的时候,先去查询缓存中,是否有可以用的缓存集,如果有命中,并还回结果,如果没有则到存储引擎去找,注意:判断标准:与缓存的sql语句,是否完全一样,区分大小
3、缓存的相关变量
mysql>show variables like '%query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
1、query_cache_min_res_unit:查询缓存中内存块的最小分配单位,默认4k,较小值会减少浪费,但会导致更频繁的内存分配操作,较大值会带来浪费,会导致碎片过多,内存不足。
2、query_cache_limit:单个查询结果能缓存的最大值,默认为1M,对于查询结果过大而无法缓存的语句,建议使用SQL_NO_CACHE
3、query_cache_size:查询缓存总共可用的内存空间;单位字节,必须是1024的整数倍,最小值40KB,低于此值有警报
4、query_cache_wlock_invalidate:如果某表被其它的会话锁定,是否仍然可以从查询缓存中返回结果,默认值为OFF,表示可以在表被其它会话锁定的场景中继续从缓存返回数据;ON则表示不允许
5、query_cache_type:是否开启缓存功能,取值为ON, OFF, DEMAND
6、参看官网
https://dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html
4、查看缓存命中的状态集
[root@centos_8 ~]# vim /etc/my.cnf
query_cache_type=ON
mysql> show global status like '%qcache%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1030296 |
| Qcache_hits | 1 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 2 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 4 |
+-------------------------+---------+
1、Qcache_free_blocks:处于空闲状态 Query Cache中内存 Block 数
2、Qcache_total_blocks:Query Cache 中总Block ,当Qcache_free_blocks:相对此值较大时,可能用内存碎片,执行FLUSH QUERY CACHE清理碎片
3、Qcache_free_memory:处于空闲状态的 Query Cache 内存总量
4、Qcache_hits:Query Cache 命中次数
5、Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次数,即没有命中的次数
6、Qcache_lowmem_prunes:记录因为内存不足而被移除出查询缓存的查询数
7、Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL语句
8、Qcache_queries_in_cache:在 Query Cache 中的 SQL 数量
5、不会被缓存的数据
1、查询语句中加了SQL_NO_CACHE参数
2、查询语句中含有获得值的函数,包含自定义函数,如:NOW() CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ()等
3、对系统数据库的查询:mysql、information_schema 查询语句中使用SESSION级别变量或存储过程中的局部变量
4、查询语句中使用了LOCK IN SHARE MODE、FOR UPDATE的语句,查询语句中类似SELECT …INTO 导出数据的语句
5、对临时表的查询操作;存在警告信息的查询语句;不涉及任何表或视图的查询语句;某用户只有列级别权限的查询语句
6、事务隔离级别为Serializable时,所有查询语句都不能缓存