2005-07-18

MySQL Query Cache

作者:邓铠剑
出处:http://weblog.mywww.biz/arnold/index.php?itemid=46&catid=6
参考:MySQL Manual

今天下载了 MySQL 4.1.12 ,准备为升级网站的数据库,MySQL 4.0.1 版本开始支持查询缓存技术,今天针对查询缓存进行了一些了解。 MySQL 4.0.1 版本开始支持查询缓存技术,今天针对查询缓存进行了一些了解。

查询缓存会存储一个 SELECT 查询的文本与被传送到客户端的相应结果。如果之后接收到一个同样的查询,服务器将从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。

注意:
1、查询缓存绝不返回过期数据。当数据被修改后,在查询缓存中的任何相关词条均被转储清除。
2、查询在分析之前先被比较,因而 SELECT * FROM tbl_name 和 Select * from tbl_name对于查询缓存被当作是不同的查询,因而查询需要严格的一致(字节对字节的),才会被认为是同样的。另外,如果一个客户端使用一个新的连接协议格式或不同于其它客户端的另一个字符集,一个查询将被视为不同的。

查询缓存的设置
在 /etc/my.cnf 配置文件中增加以下内容:

set-variable = query_cache_size=16M
set-variable = query_cache_type=1

query_cache_size 是为了存储查询结果而分配的内存数量。如果设置它为 0 ,查询缓冲将被禁止(缺省值为 0 )。

query_cache_size 这个变量也可以被设置为 (只能是数字)

0 : (OFF, 不缓存或重新得到结果)
1 : (ON, 缓存所有的结果,除了 SELECT SQL_NO_CACHE ... 查询)
2 : (DEMAND, 仅缓存 SELECT SQL_CACHE ... 查询)

在 SELECT 中的查询缓存选项
有两个可能的查询缓存相关的参数可以在一个 SELECT 查询中被指定:

  • SQL_CACHE: 如果 QUERY_CACHE_TYPE 为 DEMAND,允许该查询被缓存。如果 QUERY_CACHE_TYPE为 ON,这是缺省的。如果 QUERY_CACHE_TYPE 为 OFF,它不做任何事

  • SQL_NO_CACHE: 使这个查询不被缓存,不允许这个查询被存储到高速缓存中


查询缓存的状态和维护
使用 FLUSH QUERY CACHE 命令,可以整理查询缓存,以更好的利用内存。这个命令不会从缓存中移除任何查询。

FLUSH TABLES 会转储清除查询缓存。

RESET QUERY CACHE 从查询缓存中移除所有的查询结果。

你可以检查查询缓存在你的 MySQL 是否被启用:

mysql> SHOW VARIABLES LIKE 'have_query_cache';

+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+

1 row in set (0.00 sec)

在 SHOW STATUS 中,你可以监视查询缓存的性能:

Qcache_queries_in_cache 在缓存中已注册的查询数目
Qcache_inserts 被加入到缓存中的查询数目
Qcache_hits 缓存采样数数目
Qcache_lowmem_prunes 因为缺少内存而被从缓存中删除的查询数目
Qcache_not_cached 没有被缓存的查询数目 (不能被缓存的,或由于 QUERY_CACHE_TYPE)
Qcache_free_memory 查询缓存的空闲内存总数
Qcache_free_blocks 查询缓存中的空闲内存块的数目
Qcache_total_blocks 查询缓存中的块的总数目

Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached.

查询缓存使用变长的块,因而 Qcache_total_blocks 和 Qcache_free_blocks可能显示查询缓存的碎片。在 FLUSH QUERY CACHE 之后,只有剩余一个单独的(大的)空闲块。

注意:每个查询最小需要两个块(一个用于存储查询文本,另一个或多个用于存储查询结果)。同样的,每个被一个查询使用的表需要一个块,但是,如果有两个或更多的查询使用同一张表,仅仅只需要分配一个块就行了。

你可以使用状态变量 Qcache_lowmem_prunes 来谐调查询缓存尺寸。它计数被从缓存中移除的查询,该查询的移除是为了释放内存,以缓存新建的查询。查询缓存使用一个 least recently used (LRU) 策略来判断从缓存中移除哪个查询。

没有评论:

发表评论