mysql的缓存机制
8.0删除
为什么MySQL8.0直接把查询缓存的功能删除了呢?
首先,查询缓存的效果取决于cache的命中率,只有命中cache的查询效果才能有改善,因此无法预测其性能。
其次,查询缓存的另一个大问题是它受到单个互斥锁的保护。在具有多个内核的服务器上,大量查询会导致大量的互斥锁争用。
MySQL查询缓存解释
缓存完整的SELECT查询结果,也就是查询缓存。保存查询返回的完整结果。当查询命中该缓存,mysql会立刻返回结果,跳过了解析、优化和执行阶段,
查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有数据都将失效
命中条件
Mysql判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括如下因素,即查询本身、当前要查询的数据库、客户端协议的版本等一些都有可能影响返回结果信息。
Mysql的查询缓存在很多时候可以提升查询性能,在使用的时候,有一些问题需要特别注意。首先,打开查询缓存对 读,写 操作都会带来额外的消耗:
1、读查询在开始之前必须先检查是否命中缓存
2、如果这个读查询可以被缓存,那么当完成执行后,Mysql若发现查询缓存中没有这个查询,会将其结果存入查询缓存,这会带来额外的系统开销
3、这对写操作也会影响,因为当向某个表写入数据的时候,Mysql必须将对应表的所有缓存都设置失效。
4、对于存储引擎InnoDB用户来说,事务的一些特性会限制查询缓存的作用。当一个语句在事务中修改某个表,Mysql会将这个表对应的查询缓存都设置失效。在事务提交前该表的查询都无法被缓存,只能在事务提交后才能被缓存。因此长时间运行的事务,会大大降低查询缓存的命中率