6.9.2 查询缓存设置
( s( H, M# W! |7 f& O. Y 查询缓存为了 mysqld 添加了几个 MySQL 系统变量,它可以在配置文件中被设置,或在启动 mysqld 时的命令行上设置。* G4 y" s( S% \& p0 G
query_cache_limit 不缓存大于这个值的结果。(缺省为 1M)5 X$ W3 U; t8 o4 Z3 A
query_cache_min_res_unit 这个变量从 4.1 被引进。 查询的结果 (已被传送到客户端的数据) 在结果检索期间被存储到查询缓存中。因而,数据不会以一个大块地处理。查询缓存在需要时分配块用于处理这个数据,所以当一个块被填充后,一个新的块被分配。甚为内存分配操作是昂贵的,查询缓存以最小的尺寸 query_cache_min_res_unit 分配块。当一个查询执行完成,最后的结果块被修整到实际数据的尺寸大小,以便未使用的内存被释放。
' F: }: v; h9 t* u; x7 u6 |) } query_cache_min_res_unit 的缺省值为 4 KB,在大多数据情况下已够用了。
% b: v& [& A8 { 如果你有许多查询返回一个较小的结果,缺省的块尺寸可能会引起内存碎片 (显示为一个很大数量的空闲块(Qcache_free_blocks),这将引起查询缓存不得不因缺乏内存(Qcache_lowmem_prunes)而从缓存中删除查询)。在这种情况下,你应该减少 query_cache_min_res_unit。: M6 N) Z% H5 [1 N
如果你的主要查询返回的是大的结果集(查看 Qcache_total_blocks 和 Qcache_queries_in_cache),你可以通过增加 query_cache_min_res_unit 来增加性能。然而,要小心不要将它设得太大。, L+ z" d2 P1 f. N4 m
query_cache_size 为了存储老的查询结果而分配的内存数量 (以字节指定) 。如果设置它为 0 ,查询缓冲将被禁止(缺省值为 0 )。. b1 Z4 h. R9 z7 i& y2 D/ w0 f
query_cache_type 这个可以被设置为 (只能是数字) 选项 含义* R$ g% a) t" d3 d( i" E8 Z+ g
0 (OFF, 不缓存或重新得到结果)
( C' x* q6 R% h, } 1 (ON, 缓存所有的结果,除了 SELECT SQL_NO_CACHE … 查询)+ i+ J. \0 Y, u' N/ b: Y
2 (DEMAND, 仅缓存 SELECT SQL_CACHE … 查询)4 U0 q# r- N4 S$ Q
在一个线程(连接)内,查询缓存的行为可以被改变。句法如下所示:. @# E4 e1 i6 v8 f! R) h/ ^% q9 P
QUERY_CACHE_TYPE = OFF | ON | DEMAND QUERY_CACHE_TYPE = 0 | 1 | 2
: u6 k7 {/ X9 p/ u' }% R 选项 含义
, C. m& k ~1 A+ \4 p 0 or OFF 不缓存或重新得到结果
9 y" I' V) J. ]3 N2 J; w1 B q& W0 _ 1 or ON 缓存所有的结果,除了 SELECT SQL_NO_CACHE … 查询& z& i# U- P h4 m0 X0 P/ z6 ]
2 or DEMAND 仅缓存 SELECT SQL_CACHE … 查询$ J& o/ a" f- |' Y
6.9.3 在 SELECT 中的查询缓存选项
z2 g0 ~4 f& d$ Y6 d P 有两个可能的查询缓存相关的参数可以在一个 SELECT 查询中被指定:
9 d# N7 U, W* |" x8 H: \8 L+ [ 选项 含义/ w( E; S! ~2 o( f U5 G
SQL_CACHE 如果 QUERY_CACHE_TYPE 为 DEMAND,允许该查询被缓存。如果 QUERY_CACHE_TYPE 为 ON,这是缺省的。如果 QUERY_CACHE_TYPE 为 OFF,它不做任何事1 C. T5 e* f! P# ~
SQL_NO_CACHE 使这个查询不被缓存,不允许这个查询被存储到高速缓存中
a' x( S3 X& x) x) p/ _1 G 6.9.4 查询缓存的状态和维护1 a1 y+ q5 a4 T
使用 FLUSH QUERY CACHE 命令,你可以整理查询缓存,以更好的利用它的内存。这个命令不会从缓存中移除任何查询。FLUSH TABLES 会转储清除查询缓存。% F5 z* A) t; E% w9 d. E) J) }2 J7 [
RESET QUERY CACHE 使命从查询缓存中移除所有的查询结果。
( F. o; r4 a1 |! k 你可以检查查询缓存在你的 MySQL 是否被引进:
9 {# Z* t& l' Z8 J) ^8 [& @ mysql> SHOW VARIABLES LIKE 'have_query_cache';
9 Z1 p# G, i" ?+ l0 X3 u +------------------+-------+5 a2 q4 `& d, V, v# |
| Variable_name | Value |
+ V9 E. E7 S0 F +------------------+-------+7 D8 r* a* k- K/ H) O
| have_query_cache | YES |
' b! B2 o1 ~: F- ] +------------------+-------+; R( I2 _% N. L) i' s2 w$ i
1 row in set (0.00 sec)2 U( K5 O" G1 h. Q# R
在 SHOW STATUS 中,你可以监视查询缓存的性能:
. t0 p2 E5 O. C3 K+ W9 F; Q: L0 N 变量 含义8 V4 g, z- P* k8 i- x! H
Qcache_queries_in_cache 在缓存中已注册的查询数目$ A7 I2 a7 f5 o" K, z
Qcache_inserts 被加入到缓存中的查询数目
3 m1 N) X# \" m4 U$ e8 u$ S# ? Qcache_hits 缓存采样数数目
, B- f+ q+ b3 { Qcache_lowmem_prunes 因为缺少内存而被从缓存中删除的查询数目
. \. j% ^8 i4 w" S8 Z1 J7 E% Q1 V, I Qcache_not_cached 没有被缓存的查询数目 (不能被缓存的,或由于 QUERY_CACHE_TYPE)/ m( |; s9 q5 M/ T3 Y9 Z* ^
Qcache_free_memory 查询缓存的空闲内存总数
+ U9 |, L ?* C# x* K Qcache_free_blocks 查询缓存中的空闲内存块的数目
+ k, P3 k3 H3 y+ K1 M$ I Qcache_total_blocks 查询缓存中的块的总数目
% H3 C4 T: k3 j, Y# l Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached.
8 ~% M) @7 j' E. s 查询缓存使用变长的块,因而 Qcache_total_blocks 和 Qcache_free_blocks 可能显示查询缓存的碎片。在 FLUSH QUERY CACHE 之后,只有剩余一个单独的(大的)空闲块。" T, k6 L/ z7 d! W G) k" s
注意:每个查询最小需要两个块(一个用于存储查询文本,另一个或多个用于存储查询结果)。同样的,每个被一个查询使用的表需要一个块,但是,如果有两个或更多的查询使用同一张表,仅仅只需要分配一个块就行了。" V. o- U# H. C3 ~9 q2 u
你可以使用状态变量 Qcache_lowmem_prunes 来谐调查询缓存尺寸。它计数被从缓存中移除的查询,该查询的移除是为了释放内存,以缓存新建的查询。查询缓存使用一个 least recently used (LRU) 策略来判断从缓存中移除哪个查询。 |