概述
缓存机制简单地说就是缓存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
- have_query_cache 用来设置是否支持查询缓存区,yes 表示支持查询缓存区
- query_cache_limit 用来设置mysql可以缓存的最大结果集,大于此值得结果集不被缓存,该参数默认值是 1MB
- query_cache_min_res_unit 用来设置分配内存块的最小体积。每次给查询缓存结果分配的内存的大小,默认分配4096字节,如果此值比较小,那么回节省内存,但是这样会让系统频繁分配内存块
- query_cache_size 用来设置查询缓存使用的总内存字节数,必须是1024字节的倍数
- query_cache_type 用来设置是否启用查询缓存,,如果是OFF表示不进行缓存,如果设置为On 表示除了SQL_NO_CACHE 的查询外,缓存所用的结果,如果设置为DEMAND
- 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 缓存中总的内存块数目
提高缓存命中率
- 客户端的字符集和服务器端的字符集一致,即使客户端没有出现乱码的情况,查询数据可能因为字符集不同而没有被数据库缓存起来
- 客户端和服务器采用一致的SQL语句,虽然对于数据库而言,SQL是不区分大小写的,但是对于缓存而已会被当作不一样的查询语句
- 查询缓存不会存储不确定的查询,比如包含不确定函数(NOW()),同样的,current_user() connection_id() 这些由不同用户执行,将会产生不同结果的查询也不会被缓存,而且查询缓存也不会缓存用户自定义函数,自定义变量,临时表的查询
- 通过分区表提高命中率
缓存的弊端:
- mysql 服务器在进行查询之前会先检查查询缓存是否存在相同的查询条目
- mysql服务器在进行查询操作时,如果缓存中没有相同的查询条目,将会将查询结果缓存,这个过程也需要系统资源
- 如果数据库表发生增加操作,mysql 会查询对应的缓存中失效的查询结果,这样也需要系统资源
网友评论