mysql查询缓存

查询缓存的定义

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 |

+------------------------------+--------------------------+

 

 

 

上一篇:洛谷 P5742 【深基7.例11】评等级 题解 C/C++


下一篇:PHP — php精粹-编写高效的php代码 --- API