查询缓存原理
mysql查询缓存保存完整的查询结果,当查询命中缓存时,立刻返回结果,跳过了解析,优化和执行阶段。
如何判断缓存命中
缓存存放在一张引用表中,通过一个哈希值引用。这个哈希值包含了查询本身、要查询的数据库、客户端协议版本号等元素。因此任何元素的更改都会导致不能命中。
为什么在sql语句中使用Now()等函数或者变量时,会导致查询缓存失效?
这是因为mysql在执行完这样的查询后,压根就不会把结果放到查询缓存中。
使用查询缓存注意要点和弊端
如果要开启查询缓存,最好将查询缓存大小配置小一点。
对查询缓存的操作需要加锁,所以性能会有损失。
写操作后需要对该表所有的查询缓存失效,额外的性能消耗。
读操作的命中判断,和读后未命中情况下的更新查询缓存,都会带来性能开销。
怎么利用查询缓存更好
开启查询缓存配置项query_cache_type可以配置成OFF,ON和DEMAND。DEMAND表示只有在查询语句中明确写明SQL_CACHE的语句才会放入查询缓存。如果大量查询需要缓存,而少量不需要缓存时,则可以写明SQL_NO_CACHE。另外还有sql_buffer_result意思是说,在查询语句中,将查询结果缓存到临时表中。
这三者正好配套使用。sql_buffer_result将尽快释放表锁,这样其他sql就能够尽快执行。使用 FLUSH QUERY CACHE 命令,你可以整理查询缓存,以更好的利用它的内存。这个命令不会从缓存中移除任何查询。FLUSH TABLES 会转储清除查询缓存。
RESET QUERY CACHE 使命从查询缓存中移除所有的查询结果。