高速读取mysql_MySQL查询高速缓冲详解

查询高速缓冲概述

查询缓存存储SELECT查询的文本和发送给客户真个相应结果。如果随后收到1个相同的查询,服务器从查询缓存中重新得到查询结果,而不再需要解析和履行查询。如果你有1个不常常改变的表并且服务器收到该表的大量相同查询,查询缓存在这样的利用环境中10分有用。对许多Web服务器来讲存在这类典型情况,它根据数据库内容生成大量的动态页面。

备注1.查询缓存不返回旧的数据。当表更改后(如INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE操作),查询缓存值的相干条目被清空。2.如果你有许多mysqld服务器更新相同的MyISAM表,在这类情况下查询缓存不起作用。3.查询缓存不适用于服务器方编写的语句。如果正在使用服务器方编写的语句,要斟酌到这些语句将不会利用查询缓存.

查询高速缓冲如何工作

当MySQL服务器收到1个查询要求的时候,MySQL服务器首先检查用户对所有相干数据库和表的SELECT权限,如权限通过,然后以该SQL文本作为key来从查询缓存中检索是不是有相同的key(由于数据缓存都是以SQL文本作为key来保存的),如果从查询缓冲中找到对应的key值,就返回1个对应的查询结果,服务器把Qcache_hits状态变量的值加1,而不需要解析器对sql语句进行解析,如果查找不到对应的key值,然后履行sql的解析,然后查询,可以参考下图。

9c7c817d35c6ed321256e3fe1924308e.png

备注:

1.作为key值的sql语句是辨别大小写的,即SELECT * FROM t1与select * from t1对应的key值是不1样的。所以,如果开启了查询缓冲,在写SQL语句的时候,应注意这点。

2.如果1个表被更改了,那末使用那个表的所有缓冲查询将不再有效,并且从缓冲区中移出,这样保证了数据的1致性(即表中数据和缓冲中数据1致性)。

查询高速缓冲配置

1.查看查询缓冲是不是可以

MySQL中,可以通过have_query_cache服务器系统变量唆使查询缓存是不是可用。即便禁用查询缓存,当使用标准 MySQL2进制时,这个值总是YES。

1e5d9a1ac894910569f396d622f79935.png

2.其他重要配置参数

查询缓存系统变量名以query_cache_ 开头,以下图,我们将逐1说明。

fc08619f0dcf0976715e692dc80fa348.png

having_query_cache

就不在细说了,主要是控制查询缓冲的开启与否。

query_cache_limit

单个查询可以被缓存的具体查询结果的最大值。

query_cache_min_res_unit

该参数是控制存储查询缓冲时候,分配的内存块大小。当查询进行的时候,但如果要保存的结果比较大,超过query_cache_min_res_unit的值 ,这时候候mysql将1边检索结果,1边进行保存结果,所以,有时候其实不是把所有结果全部得到后再进行1次性保存,而是每次分配1块 query_cache_min_res_unit 大小的内存空间保存结果集,使用完后,接着再分配1个这样的块,如果还不不够,接着再分配1个块,依此类推,也就是说,有可能在1次查询中,mysql要进行屡次内存分配的操作。query_cache_min_res_unit默许值是4KB。 如果你有大量返回小结果数据的查询,默许数据块大小可能会致使内存碎片,显示为大量空闲内存块。由于缺少内存,内存碎片会强迫查询缓存从缓存内存中修整(删除)查询。这时候,你应当减少query_cache_min_res_unit变量的值,空闲块和由于修整而移出的查询的数量通过Qcache_free_blocks和Qcache_lowmem_prunes变量的值给出。固然 如果大量查询返回大结果(检查 Qcache_total_blocks和Qcache_queries_in_cache状态变量),你可以通过增加query_cache_min_res_unit变量的值来提高性。

query_cache_size

查询缓存大小,设置为0表示禁用查询缓存。 默许缓存大小设置为0;也就是禁用查询缓存。当设置query_cache_size变量为非零值时,应记住查询缓存最少大约需要40KB来分配其数据结构。(具体大小取决于系统结构)。如果你把该值设置的太小,将会得到1个正告,且会将query_cache_size值设置为0。

0e795737b73f2393069716b1e48a8ddd.png

afe774d578cdcdb0ebdf2e2c3a0134cf.png

query_cache_type

该参数主要是控制缓存行动的。query_cache_type变量的GLOBAL值将决定更改后所有连接客户真个缓存行动。在linux下,可在my.cnf(在win下,可在my.ini)中进行配置。具体客户端可以通过设置query_cache_type变量的会话值控制它们本身连接的缓存行动。例如,1个客户可以禁用自己的查询缓存。 该参数有3种值以下

0或OFF

将禁止缓存或查询缓存结果

1或ON

将允许缓存,以SELECT SQL_NO_CACHE开始的查询语句除外。

2或DEMAND

仅对以SELECT SQL_CACHE开始的那些查询语句启用缓存

查询高速缓冲保护

碎片的清算

在前面,我们可以得知,使用缓存,不可避免内存碎片,我们可使用FLUSH QUERY CACHE语句来清算查询缓存碎片,以提高内存使用性能。该语句不从缓存中移出任何查询。RESET QUERY CACHE语句从查询缓存中移出所有查询。FLUSH TABLES语句也履行一样的工作,区分optimize table tableName,关于optimize可以参考(http://blog.csdn.net/hsd2012/article/details/51485250)。

查询缓存性能监控

为了监视查询缓存性能,使用SHOW STATUS查看缓存状态变量:

b895978515e5248a47d98478e01bae66.png

Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。履行FLUSH QUERY CACHE会对缓存中的碎片进行整理,只保存1个空闲块。

Qcache_free_memory:缓存中的空闲内存。

Qcache_hits:每次查询在缓存中命中时就增大

Qcache_inserts:每次插入1个查询时就增大。命中次数除以插入次数就是不中比率。

Qcache_lowmem_prunes:缓存出现内存不足,并且必须为了缓存新的查询,而从查询缓冲区中移出到自由内存中的查询的数目。这个数字最好长时间来看;如果这个 数字在不断增长,就表示可能碎片非常严重,或内存很少。(上面的 Qcache_free_blocks和Qcache_free_memory可以告知您属于哪一种情况) 。从查询缓冲区移除查询缓冲,使用最近最少使用(LRU)策略。

Qcache_not_cached:不合适进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或用了now()之类的函数。

Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。

Qcache_total_blocks:缓存中块的数量。

Qcache_total_blocks和Qcache_free_blocks可以显示查询缓存内存碎片。

备注

以上叙述,主要参考mysql手册。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值