MySQLQuery Cache保存查询返回的结果集。当查询命中缓存时,MySQL跳过解析、优化和执行阶段,直接返回查询结果。
Query Cache系统会跟踪查询中涉及的每一张表,如果这些表发生变化,那么和这个表相关的所有缓存数据都会失效。这种机制效率看起来比较低,因为在数据表变化时,查询到的结果可能没有发生变化。
QueryCache对应用程序是透明的,应用程序无需关心MySQL是通过Query Cache返回的还是实际执行SQL语句返回的。有一种方式查询缓存和原生的SQL工作方式有所不同,当要查询的表被LOCK TABLE(写锁)锁住时,查询仍然可以从Query Cache返回结果。通过参数query_cache_wlock_invalidate= OFF在锁定时刻仍然允许读取该表相关的 Query Cache,而query_cache_wlock_invalidate =ON 在写锁定的同时将使该表相关的所有 Query Cache 失效。
1. 判断缓存是否命中
(1) 缓存存放在一个引用表中,通过哈希值引用。通过一定的哈希规则生成唯一的key,select的结果生成value,即key-> value。该哈希值包含如下因素,即查询本身、当前要查询的数据库、客户端协议的版本等一些可能会影响结果的信息。
(2) 当判断是否命中时,不会解析、优化和执行SQL语句,而是直接使用SQL语句和客户端发送过来的其他原始信息。在SQL查询语句中,任何字符的不同,例如空格,注释,大小写等都会造成缓存不命中。
(3) 当查询语句中有一些不确定的数据,也不会