Rumah >pangkalan data >tutorial mysql >MySQL查询高速缓冲详解
查询高速缓冲概述 查询缓存存储SELECT查询的文本以及发送给客户端的相应结果。如果随后收到一个相同的查询,服务器从查询缓存中重新得到查询结果,而不再需要解析和执行查询。如果你有一个不经常改变的表并且服务器收到该表的大量相同查询,查询缓存在这样的
查询缓存存储SELECT查询的文本以及发送给客户端的相应结果。如果随后收到一个相同的查询,服务器从查询缓存中重新得到查询结果,而不再需要解析和执行查询。如果你有一个不经常改变的表并且服务器收到该表的大量相同查询,查询缓存在这样的应用环境中十分有用。对于许多Web服务器来说存在这种典型情况,它根据数据库内容生成大量的动态页面。
备注1.查询缓存不返回旧的数据。当表更改后(如INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE操作),查询缓存值的相关条目被清空。2.如果你有许多mysqld服务器更新相同的MyISAM表,在这种情况下查询缓存不起作用。3.查询缓存不适用于服务器方编写的语句。如果正在使用服务器方编写的语句,要考虑到这些语句将不会应用查询缓存.
当MySQL服务器收到一个查询请求的时候,MySQL服务器首先检查用户对所有相关数据库和表的SELECT权限,如权限通过,然后以该SQL文本作为key来从查询缓存中检索是否有相同的key(因为数据缓存都是以SQL文本作为key来保存的),如果从查询缓冲中找到对应的key值,就返回一个对应的查询结果,服务器把Qcache_hits状态变量的值加一,而不需要解析器对sql语句进行解析,如果查找不到对应的key值,然后执行sql的解析,然后查询,可以参考下图。
备注:
1.作为key值的sql语句是区分大小写的,即SELECT * FROM t1
与select * from t1
对应的key值是不一样的。所以,如果开启了查询缓冲,在写SQL语句的时候,应注意这点。
2.如果一个表被更改了,那么使用那个表的所有缓冲查询将不再有效,并且从缓冲区中移出,这样保证了数据的一致性(即表中数据和缓冲中数据一致性)。
1.查看查询缓冲是否可以
MySQL中,可以通过have_query_cache服务器系统变量指示查询缓存是否可用。即使禁用查询缓存,当使用标准 MySQL二进制时,这个值总是YES。
2.其他重要配置参数
查询缓存系统变量名以query_cache_ 开头,如下图,我们将逐一说明。
query_cache_size
查询缓存大小,设置为0表示禁用查询缓存。 默认缓存大小设置为0;也就是禁用查询缓存。当设置query_cache_size变量为非零值时,应记住查询缓存至少大约需要40KB来分配其数据结构。(具体大小取决于系统结构)。如果你把该值设置的太小,将会得到一个警告,且会将query_cache_size值设置为0。
在前面,我们可以得知,使用缓存,不可避免内存碎片,我们可以使用FLUSH QUERY CACHE语句来清理查询缓存碎片,以提高内存使用性能。该语句不从缓存中移出任何查询。RESET QUERY CACHE语句从查询缓存中移出所有查询。FLUSH TABLES语句也执行同样的工作,区别optimize table tableName,关于optimize可以参考(http://blog.csdn.net/hsd2012/article/details/51485250)。
为了监视查询缓存性能,使用SHOW STATUS查看缓存状态变量:
Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。执行FLUSH QUERY CACHE会对缓存中的碎片进行整理,只保留一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
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手册。