mysql缓存判断

mysql的缓存大体分为2种,一种是对执行计划的缓存,能够跳过sql解析和执行计划阶段。这中缓存只有在某些场景下能够实现。另一种是缓存完整的select查询。此次主要说说mysql第二种缓存的机制。
先简单提一下第一种缓存形式。在这以前,先说说mysql的整个执行过程。mysql

请输入图片描述


这是一个简单的mysql的执行过程的图片,mysql缓存的第一种方式就是能够跳过解析,预处理,执行计划等阶段,直接与用api和底层的存储引擎进行交互。这种通常用到的比较少。通常能够不考虑sql

如今重点说一下第二种方式数据库

第二种方式是Mysql会用一个大小写不敏感的的检查看看sql语句是否是以sel开头,若是是,mysql将考虑将sql语句的结果缓存起来,这里只是考虑,并非每一个以sel开头的sql语句都会被缓存起来,mysql的底层缓存逻辑是很复杂的。segmentfault

mysql是如何判断缓存命中的。mysql判断缓存命中的方法很简单,缓存存放到一个引用表中,经过一个哈希引用。每一个哈希引用包括以下因素:查询自己、当前查询的数据库、客户端的协议版本等等。有2点须要说明一下:
一、 mysql不会只能的检查两条sql是否是同样,也就是说由于一个空格的不同就会致使不能使用缓存。因此运用层的sql编码规则的统一是很重要的。有一点是意外,sql的大小写是不敏感的。sel和SEL是同样的,但这限于检查是否是能够缓存的时候,不影响最后的缓存结果,例如:select * from table 和 SELECT * FROM TABLE 是不同的。
二、 当sql语句中含有一些不肯定的数据时是不能被缓存的。例如:CURRENT_USER或者CONNECTION_ID()的查询。
在这里要提一下的是,常常会有人说“若是一个查询里面包含不肯定的函数时,mysql就不会坚持缓存”。事实上这种说法是不正确的。这种语句mysql是不缓存。也就是说,mysql每次都会检查。只是包含不肯定函数的sql语句压根缓存不起来,即便检查也是查不到的。
InnoDB的处理要复杂一些。InnoDB的事务会限制缓存的使用。当一个语句中在事务中修改了某个表,mysql会将这个表的全部的查询缓存都设置失效。而事实上,innodb的多版本特性会暂时将这个修改对其余事务屏蔽。在这个事务提交前,这个表的相关查询是没法被缓存的。因此全部在这个表上面的查询都只能在这个事务提交后才被缓存。所以,长时间的事务运行会致使缓存命中率的降低。api

相关文章
相关标签/搜索