MySQL查询缓存保存查询返回的完整结果,当查询命中该缓存,MySQL会立刻返回结果,跳过解析、优化和执行过程。
查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有的缓存数据都将失效,这种机制效率看起来比较低,因为数据表变化时可能对查询结果并没有影响,但是这种简单实现代价很小,而这点对于一个非常繁忙的系统来说非常重要。
判断是否命中时,MySQL不会解析,而是直接使用SQL语句和客户端发送过来的其它原始信息。任何字符上的不同,例如空格、注释,丢回导致缓存的不命中。通常使用统一的编码规则是一个好的习惯,会让你的系统运行的更快。
当查询语句中有一些不确定的数据时,不会被缓存,比如函数now()。实际上,如果缓存中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL系统表、或者任何包含列级别权限的表,都不会被缓存。
三、使用查询缓存需谨慎打开查询缓存对读和写操作都会带来额外的消耗:
虽然如此,查询缓存仍然会给系统带来性能的提升。但是,上述的额外消耗也可能不断增加,再加上对查询缓存操作是一个加锁排它操作,这个消耗也不小。
对InnoDB用户来说,事务的一些特性会限制查询缓存的使用。当一个语句在事务中修改了某个表,在事务提交前,MySQL都会将这个表对应的查询缓存设置失效,因此,长时间运行的事务,会大大降低查询缓存的命中率。
四、如何分析和配置查询缓存五、InnoDB和查询缓存因为InnoDB有自己的MVCC机制,所以相比其它存储引擎,InnoDB和查询缓存的交互要更加复杂。
MVCC是多版本并发控制,是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。MVCC解决的是读写时的线程安全问题,线程不用去争抢读写锁。
MVCC所提到的读是快照读,也就是普通的select语句,快照读在读写时不用加锁,不过可能会读到历史数据。
另一种读的方式是当前读,是一种悲观锁的操作,它会对当前读取的数据进行加锁,所以读到的数据都是最新的,主要包括以下操作:
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基础教程系列
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧