【一】.概念
查询缓存,就是将查询结果缓存起来,如果遇到相同的Sql查询,直接从缓存中读取结果。例如在一个商城中的商品分类是不会经常变动的,完全可以走缓存,没必要每次从磁盘中读取。
【二】.查询缓存开启状态
执行Sql:
show VARIABLES like '%query_cache%'
输出结果:
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 当前数据库是否支持缓存 query_cache_limit 单个查询能够使用的缓冲区 query_cache_min_res_unit 表示缓存存储于内存的最小单元,默认为4k,也就是说,即使查询结果只有1k,也会占用4k内存;所以,如果此值设置的过大,会造成内存空间的浪费,如果此值设置的过小,则会频繁的分配内存单元或者频繁的回收内存单元。 query_cache_size 表示查询缓存的总大小,也就是说,内存中用于查询缓存的空间大小,如果其值为0,即使开启了查询缓存,也无法缓存 query_cache_type 其值为ON、OFF、DEMAND,分别表示已启用、已禁用、按需缓存 query_cache_wlock_invalidate 表示查询语句所查询的表如果被写锁锁定,是否仍然使用缓存返回结果。OFF表示可以从缓存返回结果,ON表示等待写锁释放取出最新数据
【三】.开启缓存
上面的配置项query_cache_type为OFF状态表示未开启查询缓存,需要在mysql配置文件开启。注意是在[mysqld]后面设置query_cache_type = ON
【四】.Sql语句大小写影响缓存命中
select * from shop_category;
SELECT * FROM shop_category;
对于缓存来讲上面的2条Sql是不同的sql查询,虽然结果一样,假如第一条sql存在缓存,第二条语句依然不走缓存。因为mysql对比是否相同是使用sql语句的hash来对比的
【五】.灵活使用缓存
当query_cache_type = ON 时候, 我们也可以禁止部分SQL使用缓存:
select SQL_NO_CACHE name from shop_category;
当query_cache_type = DEMAND 时候, 我们也可以设置SQL使用缓存,没有设置全部不缓存
select SQL_CACHE name from shop_category;
【六】.缓存命中的查看
执行Sql:
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 4 Qcache_queries_in_cache 2 Qcache_total_blocks 6
输出解释:
Qcache_free_blocks 表示已分配的内存块中空闲块的数量 Qcache_free_memory 表示查询缓存的空闲总量大小 Qcache_hits 表示已经被缓存的Sql的命中次数 Qcache_inserts 表示在未命中缓存时,将查询结果写入缓存的次数 Qcache_lowmem_prunes 表示用于查询缓存的内存区域的修剪次数,修剪?修剪就是当用于缓存的内存被沾满时,mysql会使用LRU算法清除命中率低的缓存项,从而空余出部分内存空间。此值的数量越大,证明我们分配的内存小了,有必要跳转query_cache_size的值 Qcache_not_cached 表示没有被缓存的查询语句的数量 Qcache_queries_in_cache 表示已经缓存的SQL语句的数量 Qcache_total_blocks 表示当前查询缓存占用的内存的block数量
【七】.公式计算
查询缓存的碎片率 =(Qcache_free_blocks / Qcache_total_blocks)* 100%
查询缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查询缓存命中率 = (Qcache_hits / Com_select)* 100% (Com_select=show status like "Com_select%")
如果碎片率太高,证明我们缓存内存碎片略多,可以尝试适当的调小query_cache_min_res_unit的值,也可以使用FLUSH QUERY CACHE语句来清理缓存碎片。
如果查询缓存利用率太低,则表示query_cache_size设置的可能过大,可适度调小,如果缓存利用率非常高,同时Qcache_lowmem_prunes的值比较大,则表示query_cache_size的值设置的略小。
query_cache_min_res_unit的预估值参考计算公式: (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
【八】.清理缓存
flush query cache 清理缓存碎片
reset query cache 清理缓存
下面的是商品数据表,id是主键,catename是分类,titile是标题,price是价格,现在要求计算每种分类下的商品平均价格.id catename &n...
我们要明白Mysql字段的长度能存多少东西,首先需要明白Mysql是计算字节长度,还是计算字符长度。在mysql4.x的版本长度代表的是字节长度.例如在mysql4.x的版本中varchar(10)能储存的中英文长度如下:(1).采用ISO8859-1编码方式时,一个中/英文都只占一个字节;(2)....
项目和第三方系统对接,由于第三方开发人员属于兼职,数据库结构不一致的问题只能我来处理。此处文章用本地模拟演示。数据库资料:1号服务器: 账号root 密码root IP:127.0.0.1 数据库名称:data1 2号服务器...
在项目中发现大量的form连接表,就开始质疑inner join 和 form a,b的性能问题。找到一份有价值的资料,特别记录:ANSI SQL规范首选INNER JOIN语法。此外,尽管使用WHERE子句定义联结的确比较简单,但是使用明确的联结语法能够确保不会忘记联结条件,有时候这样做也能影响性...
已有表名log来记录用户日志,id是主键,uid是用户id,rmk是备注,addtime是时间戳,需要取出不重复的用户日志记录默认的结果集:id uid rmk ...
_通配符只匹配单个字符。假如products表存在以下数据: 需要匹配到prod_nameprod_id prod_name JP1000 JetPack 1000 JP2000 JetPack 2000SQL语句: SE...