您的位置:首页 > 数据库 > MySQL

MySQL缓存的配置与使用

2019-10-27 10:10 1301 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_40845019/article/details/102764189

MySQL缓存主要包括关键字缓存(key cache)和查询缓存(Query cache)。

1. 查询缓存

  对于InnoDB数据库,MySQL采用缓冲池(Buffer Pool)的方式来缓存数据和索引;对于MyISAM数据库,MySQL采用缓存的方式来缓存数据和索引。
  MySQL查询缓存机制简单地说就是缓存SQL语句及查询结果,如果运行相同的SQL,服务器直接从缓存中取到结果,而不需要再去解析和执行SQL。缓存能被所有的会话共享,一旦某个客户建立了拆线呢缓存,其他发送同样SQL语句的客户端也可以使用这些缓存。
  如果表更改(指表中任何数据或者结构改变)了,那么使用这个表的所有缓冲查询将不再有效,查询缓存值的相关条目将被清空。查询缓存适用于一些不常改变数据且有大量相同的SQL查询的表。

注意
  1)在多个mysqld服务器更新相同的MyISAM表时,查询缓存不会生效。
  2)查询相同指的是逐字节相同,即字符相同、字符的大小写也相同。

2. MySQL查询缓存的工作原理

1)当MySQL收到传入的SQL语句时,它首先和之前已经解析过的SQL语句进行比对;
2)如果发现相同,则返回已缓存数据;
3)如果没有找到缓存,则执行SQL语句查询,包括原来的SQL解析、优化等;
4)执行完SQL查询结果后,将SQL查询结果缓存到缓存表中。

  当传入的SQL语句被认为是存在缓存的情况下,系统会修改MySQL的一个状态变量Qcache_hits,并将其值增加1。

Qcache_hits的值为0,表示目前缓存的命中率为0,,一旦缓存失效该值会大于0。

3. MySQL查询缓存失效的情况

1)两条sql语句的大小写不一致;

SELECT 课程名 from KC;
select 课程名 from kc;

2)如果一条SQL语句是另一条SQL语句的子句,子句中的SQL语句不会被缓存;

select 课程名 from kc where 学分 in(
select 学分 from kc)
);

3)如果SQL语句是存储过程、触发器或者事件内部的一条语句,不会被缓存;
4)查询缓存也受条件的影响,对于没有权限访问数据库中数据的用户,即使输入了同样的SQL语句,缓存中的数据也是无权访问的;
5)查询缓存不会存储有不确定结果的查询。任何一个包含不确定函数(比如NOW()或者CURRENT-DATE())的查询不会被缓存。同样,CURRENT_USER()或者CONNECTION_ID()这些由不同用户执行,将会产生不同的结果的查询也不会被缓存;
6)在事务中使用了序列化隔离级别的表达式;
7)对于有列级权限的表的查询。

4. 缓存的内存管理

  • query_cache_size:显示查询缓存的大小,其值通常大于40KB。
  • query_cache_type:表示是否启用缓存。其值可以设置为0、1或者2,还可以设置为ON、OFF或者DEMAND。其中:

0/OFF——不使用缓存;1/ON——打开缓存;2/DEMAND——根据需要使用

  • query_cache_limit:可缓存的最大结果集,大于此值的结果集不会被缓存。如果结果集大于此值,则MySQL增加Qcache_not_cached状态值。
  • query_cache_min_res_unit:是为了避免Qcache碎片,需要平衡query_cache_min_res_unit:分配内存块时的最小单位大小。大小是服务器保存结果时分配的块的数量,如果此值较小,节省内存,但会使系统频繁分配内存块(占有CPU),若块的体积过大,则会造成较多的内存碎片(占有内存)。

Qcache碎片:当查询进行的时候,MySQL把查询结果保存在查询缓存中,如果要保存的结果比较大,超过query_cache_min_res_unit的值,MySQL将一边检索结果,一边进行保存结果(即,每次分配一块query_cache_min_res_unit大小的内存空间保存结果集,使用完后,接着再分配一个这样的块,如果还不够,接着再分配一个,依次类推……)。也就是说,有可能在一次查询中,MySQL要进行多次内存分配的操作,当一块分配的内存没有完全使用时,MySQL会把这块内存trim掉,把没有使用的那部分归还以重复利用。

5. 减少碎片的策略

1)选择合适的block大小;
2)使用FLUSH QUERY CACHED命令整理碎片。在整理期间,会导致其他连接无法使用查询缓存。(清空缓存的命令式:RESET QUERY CACHE)

6. InnoDB与查询缓存

1)InnoDB会对每个表设置一个事务计数器,里面存储当前最大事务的ID值。当一个事务提交时,InnoDB会使用MVCC中系统事务ID最大的事务ID更新当前表的计数器。只有比这个最大ID大的事务能使用查询缓存,其他比这个ID小的事务则不能使用查询缓存。
2)在InnoDB中,所有有加锁操作的事务都不使用任何查询缓存。

7. 配置查询缓存

命令行的配置方式:

  • set global query_cache_size = 5000; 全局设置
  • set session query_cache_size = 5000; 会话设置
  • set session query_cache_type=off; 关闭缓存

注意:query_cache_size被MySQL认为是global系统变量,无法设置成session的。

几个常用命令:

  • show variables like “%query_cache%”; 查看缓存是否可用
  • show status like “qcache_hits”; 查看命中率
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: