MYsql中的Sql执行流程
5.7以前的查缓存
在mysql5.7中,当mysql拿到一条sql后,首先会到查询缓存中看看,之前是否执行过这条sql语句。之前执行过的语句,会以key value的形式存储在缓存中。(key是sql语句,value是查询结果)
如果你的语句恰好命中了缓存,那么这条sql不会再去走后续的执行阶段,而是直接取缓存返回,节省了时间,提高了效率。
但其实呢,这个mysql自带的查询缓存是很鸡肋的,原因有二。
首先sql相同的概率很低(需要每个字符都相同,空格也不能有区别)
第二,也是更重要的,就是相同的查询会命中相同的结果。但是其实相同的查询,在不同的时间点是不一定一样的,或者可以说大概率不同。比如NOW这个函数,随时都不同。还有select * from table where … 这样的语句,并不能屏蔽中间有修改的情况,用户中间修改了一些数据,但是缓存依然会命中,这就会产生严重错误。
也即,这种缓存只适用于很久都不更新的库。
也正是由于以上两点,mysql在8.0中,直接删掉了缓存的功能。