MySQL进阶实战11,查询缓存

Posted 哪 吒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL进阶实战11,查询缓存相关的知识,希望对你有一定的参考价值。

目录

一、查询缓存是什么?

mysql查询缓存保存查询返回的完整结果,当查询命中该缓存,MySQL会立刻返回结果,跳过解析、优化和执行过程。


查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有的缓存数据都将失效,这种机制效率看起来比较低,因为数据表变化时可能对查询结果并没有影响,但是这种简单实现代价很小,而这点对于一个非常繁忙的系统来说非常重要。

二、MySQL如何判断缓存命中

判断是否命中时,MySQL不会解析,而是直接使用SQL语句和客户端发送过来的其它原始信息。任何字符上的不同,例如空格、注释,丢回导致缓存的不命中。通常使用统一的编码规则是一个好的习惯,会让你的系统运行的更快。

当查询语句中有一些不确定的数据时,不会被缓存,比如函数now()。实际上,如果缓存中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL系统表、或者任何包含列级别权限的表,都不会被缓存。

三、使用查询缓存需谨慎

打开查询缓存对读和写操作都会带来额外的消耗:

  1. 读查询在执行之前要先检查是否命中缓存;
  2. 如果读查询可以被缓存,那么当完成执行后,MySQL如果发现缓存中没有这个查询,会将其结果存入查询缓存,这会带来额外的系统消耗;
  3. 对写操作也有影响,因为当向某个表写入数据的时候,MySQL必须将对应表的所有缓存设置失效。如果查询缓存非常大或者碎片很多,这个操作就可能会带来很大的系统消耗;

虽然如此,查询缓存仍然会给系统带来性能的提升。但是,上述的额外消耗也可能不断增加,再加上对查询缓存操作是一个加锁排它操作,这个消耗也不小。

对InnoDB用户来说,事务的一些特性会限制查询缓存的使用。当一个语句在事务中修改了某个表,在事务提交前,MySQL都会将这个表对应的查询缓存设置失效,因此,长时间运行的事务,会大大降低查询缓存的命中率。

四、如何分析和配置查询缓存

五、InnoDB和查询缓存

因为InnoDB有自己的MVCC机制,所以相比其它存储引擎,InnoDB和查询缓存的交互要更加复杂。

MVCC是多版本并发控制,是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。MVCC解决的是读写时的线程安全问题,线程不用去争抢读写锁。

MVCC所提到的读是快照读,也就是普通的select语句,快照读在读写时不用加锁,不过可能会读到历史数据。

另一种读的方式是当前读,是一种悲观锁的操作,它会对当前读取的数据进行加锁,所以读到的数据都是最新的,主要包括以下操作:

  1. select lock in share mode,共享锁
  2. select for update,排它锁
  3. insert,排它锁
  4. update,排它锁
  5. delete,排它锁

InnoDB会控制在一个事务中是否可以使用查询缓存,InnoDB会同时控制对查询缓存的读写操作。事务是否可以访问查询缓存取决于当前事务的ID,以及对应的数据表上是否有锁。每一个InnoDB表的内存数据字典都保存了一个事务ID号,如果当前事务ID小于该事务ID,则无法访问查询缓存。

如果表上有任何的锁,那么对这个表的任何查询语句都是无法被缓存的。例如,某个事务执行了select for update语句,那么在这个锁释放之前,任何其它的事务都无法从查询缓存中读取与这个表相关的缓存结果。

当事务提交时,InnoDB持有锁,并使用当前的一个系统事务ID更新当前表的计数器。InnoDB将每个表的计数器设置成某个事务ID,而这个事务ID就代表了当前存在的且修改了该表的最大的事务ID。



MySQL进阶实战系列文章

MySQL进阶实战1,数据类型与三范式

MySQL进阶实战2,那些年学过的事务

MySQL进阶实战3,mysql索引详解,上篇

MySQL进阶实战4,那些年学过的索引,下篇

MySQL进阶实战5,为什么查询速度会慢

MySQL进阶实战6,缓存表、视图、计数器表

MySQL进阶实战7,查询的执行过程

MySQL进阶实战8,分区表详解

MySQL进阶实战9,InnoDB和MyISAM的数据分布对比

MySQL进阶实战10,MySQL全文索引

SQL性能优化的21个小技巧

mysql索引详解

MySql基础知识总结(SQL优化篇)

哪吒精品系列文章

Java学习路线总结,搬砖工逆袭Java架构师

10万字208道Java经典面试题总结(附答案)

Java基础教程系列

以上是关于MySQL进阶实战11,查询缓存的主要内容,如果未能解决你的问题,请参考以下文章

MySQL进阶实战5,为什么查询速度会慢

MySQL进阶实战6,缓存表视图计数器表

MySQL进阶实战7,查询的执行过程

MySQL进阶实战6,缓存表视图计数器表

MySQL进阶实战9,InnoDB和MyISAM的数据分布对比

MySQL进阶实战1,数据类型与三范式