查询缓存的定义
qeury cache是一个内存池,用于缓存select语句的sql文本和结果集,当后面有相同的sql语句时(且表的数据未发生改变),mysql仅做语法和权限验证,然后会跳过解析、优化器、接口调用、innodb执行的阶段,直接到查询缓存中把对应的结果集返回给会话。相同sql是指sql文本完全一样,且没有变量和类似now()这样的函数。只要表有变动,qc就会被flush。qc也不支持分区表
qc的前提
1.查询缓存在对一些不经常变动的表
2.qc对sql的大小写敏感,select和Select是不一样的,文本至少必须一模一样才有可能触发qc。这个跟sql id有些类似,不同是sql文本的sql id是不一样的(md5转码),sql id不同可能就需要重新解析,当然qc本身是不需要解析的。
3.不能有变量和不确定的数据,比如now()函数
4.非分区表的结果集
5.结果集大小小于qc size
qc的优势
1.有大量一致性sql执行,sql执行效率会有提升
2.sql执行时间很长,资源消耗较多,但是返回结果很少,那么很适合查询缓存。
qc的劣势
1 在某些情况下,qc的效率可能会更低,这取决于什么样的业务逻辑场景
2 表有数据更新时,qc会flush数据,如果qc size较大会消耗资源
3 第一次触发qc时,会加载结果集,如果频繁加载会对性能有较大影响
4 内存碎片也可能导致第一次qc的结果集加载不了,即使qc size比结果集大
sql_cache 语句
当query_cache_type处于 ON or DEMAND时,使用sql_cache可以让sql走qc
使用SQL_NO_CACHE不走qc。当qc关闭时,肯定不会去qc查找结果集
SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;
关闭qc
在真实环境中,qc可能引发性能问题,建议关闭qc
设置query_cache_size为0,可动态调整
mysql> show variables like '%query%';
+------------------------------+--------------------------+
| Variable_name | Value |
+------------------------------+--------------------------+
| binlog_rows_query_log_events | OFF |
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| long_query_time | 10.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | /data/mysql/lzl-slow.log |
+------------------------------+--------------------------+
13 rows in set (0.05 sec)
mysql>
mysql> set global query_cache_size=0;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show variables like '%query%';
+------------------------------+--------------------------+
| Variable_name | Value |
+------------------------------+--------------------------+
| binlog_rows_query_log_events | OFF |
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| long_query_time | 10.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | /data/mysql/lzl-slow.log |
+------------------------------+--------------------------+