mysql查询缓存
show variables like "%query_cache%"
have_query_cache YES 是否支持查询缓存
query_cache_limit 1048576 查询结果超过1m(默认),则不会进行查询结果缓存
query_cache_min_res_unit 4096 在查询缓存中分配内存块时的最小单位,即使查询结果远小于此仍需要分配这么大的存储空间
query_cache_size 0 查询缓存使用的总缓存空间,初始化时分配通过(malloc),初始化之后的查询结果缓存需要的内存块,由mysql自己进行管理
query_cache_type ON 是否打开了查询缓存
查询缓存设置
查询缓存为了 mysqld 添加了几个 MySQL 系统变量,它可以在配置文件中被设置,或在启动 mysqld 时的命令行上设置。
query_cache_limit不缓存大于这个值的结果。(缺省为 1M)query_cache_min_res_unit这个变量从 4.1 被引进。 查询的结果 (已被传送到客户端的数据) 在结果检索期间被存储到查询缓存中。因而,数据不会以一个大块地处理。查询缓存在需要时分配块用于处理这个数据,所以当一个块被填充后,一个新的块被分配。甚为内存分配操作是昂贵的,查询缓存以最小的尺寸query_cache_min_res_unit分配块。当一个查询执行完成,最后的结果块被修整到实际数据的尺寸大小,以便未使用的内存被释放。query_cache_min_res_unit的缺省值为 4 KB,在大多数据情况下已够用了。- 如果你有许多查询返回一个较小的结果,缺省的块尺寸可能会引起内存碎片 (显示为一个很大数量的空闲块(
Qcache_free_blocks),这将引起查询缓存不得不因缺乏内存(Qcache_lowmem_prunes)而从缓存中删除查询)。在这种情况下,你应该减少query_cache_min_res_unit。 - 如果你的主要查询返回的是大的结果集(查看
Qcache_total_blocks和Qcache_queries_in_cache),你可以通过增加query_cache_min_res_unit来增加性能。然而,要小心不要将它设得太大。
query_cache_size为了存储老的查询结果而分配的内存数量 (以字节指定) 。如果设置它为 0 ,查询缓冲将被禁止(缺省值为 0 )。query_cache_type这个可以被设置为 (只能是数字)选项 含义 0 (OFF, 不缓存或重新得到结果) 1 (ON, 缓存所有的结果,除了 SELECT SQL_NO_CACHE ...查询)2 (DEMAND, 仅缓存 SELECT SQL_CACHE ...查询)
在一个线程(连接)内,查询缓存的行为可以被改变。句法如下所示:
QUERY_CACHE_TYPE = OFF | ON | DEMAND QUERY_CACHE_TYPE = 0 | 1 | 2
| 选项 | 含义 |
| 0 or OFF | 不缓存或重新得到结果 |
| 1 or ON | 缓存所有的结果,除了 SELECT SQL_NO_CACHE ... 查询 |
| 2 or 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) 策略来判断从缓存中移除哪个查询。

浙公网安备 33010602011771号