查询缓存

2018-10-14  本文已影响35人  咸鱼佬

概述

缓存机制简单地说就是缓存SQL 语句和查询结果,如果运行相同的sql 语句,服务器会直接从缓存中取到结果,而不需要再去解析执行sql语句。查询缓存会存储最新数据,而不会返回过期数据,当数据被修改后,在查询缓存中的任何相关数据都会清除,对于频繁更新的表,查询缓存是不适合的,而对于一些不经常改变数据且大量相同sql 查询的表,查询缓存会提高很大的性能

认识查询缓存

have_query_cache YES
query_cache_limit 1048576
query_cache_min_res_unit 4096
query_cache_size 1048576
query_cache_type OFF
query_cache_wlock_invalidate OFF

  1. have_query_cache 用来设置是否支持查询缓存区,yes 表示支持查询缓存区
  2. query_cache_limit 用来设置mysql可以缓存的最大结果集,大于此值得结果集不被缓存,该参数默认值是 1MB
  3. query_cache_min_res_unit 用来设置分配内存块的最小体积。每次给查询缓存结果分配的内存的大小,默认分配4096字节,如果此值比较小,那么回节省内存,但是这样会让系统频繁分配内存块
  4. query_cache_size 用来设置查询缓存使用的总内存字节数,必须是1024字节的倍数
  5. query_cache_type 用来设置是否启用查询缓存,,如果是OFF表示不进行缓存,如果设置为On 表示除了SQL_NO_CACHE 的查询外,缓存所用的结果,如果设置为DEMAND
  6. query_cache_wlock_invalidate 用来设置是否允许在其他连接处于lock状态时,使用缓存结果,默认是OFF,不会影响大部分应用。在默认情况下,一个查询中使用的表即使被Lock tables 命令锁住了,查询也能被缓存下来

查询缓存命中次数

show status like 'Qcache_hits'

监控和维护查询缓存

flush query cache
该命令用于整理查询缓存,以便更好地利用查询缓存的内存,这个命令不会从缓存中移除任何的查询结果
reset query cache
用于移除查询缓存中所有的查询结果

show status like 'Qcache%'

Qcache_free_blocks 1 缓存中空余的内存块
Qcache_free_memory 1029312 缓存中剩余的内存大小
Qcache_hits 2 缓存命中总次数
Qcache_inserts 2 被加入到缓存中的查询数目
Qcache_lowmem_prunes 0 因内存不足而被删除的查询数目
Qcache_not_cached 38 没有被缓存的查询数目
Qcache_queries_in_cache 2 在缓存中已经注册的查询数目
Qcache_total_blocks 6 缓存中总的内存块数目

提高缓存命中率

  1. 客户端的字符集和服务器端的字符集一致,即使客户端没有出现乱码的情况,查询数据可能因为字符集不同而没有被数据库缓存起来
  2. 客户端和服务器采用一致的SQL语句,虽然对于数据库而言,SQL是不区分大小写的,但是对于缓存而已会被当作不一样的查询语句
  3. 查询缓存不会存储不确定的查询,比如包含不确定函数(NOW()),同样的,current_user() connection_id() 这些由不同用户执行,将会产生不同结果的查询也不会被缓存,而且查询缓存也不会缓存用户自定义函数,自定义变量,临时表的查询
  4. 通过分区表提高命中率

缓存的弊端:

  1. mysql 服务器在进行查询之前会先检查查询缓存是否存在相同的查询条目
  2. mysql服务器在进行查询操作时,如果缓存中没有相同的查询条目,将会将查询结果缓存,这个过程也需要系统资源
  3. 如果数据库表发生增加操作,mysql 会查询对应的缓存中失效的查询结果,这样也需要系统资源
上一篇 下一篇

猜你喜欢

热点阅读