6.9.2 查询缓存设置
6 E2 L: ?# M5 X' q) a+ e 查询缓存为了 mysqld 添加了几个 MySQL 系统变量,它可以在配置文件中被设置,或在启动 mysqld 时的命令行上设置。
( K9 f% K y: @2 N+ z8 N query_cache_limit 不缓存大于这个值的结果。(缺省为 1M)
9 U& z+ |4 k9 u: ~4 i5 F) ` query_cache_min_res_unit 这个变量从 4.1 被引进。 查询的结果 (已被传送到客户端的数据) 在结果检索期间被存储到查询缓存中。因而,数据不会以一个大块地处理。查询缓存在需要时分配块用于处理这个数据,所以当一个块被填充后,一个新的块被分配。甚为内存分配操作是昂贵的,查询缓存以最小的尺寸 query_cache_min_res_unit 分配块。当一个查询执行完成,最后的结果块被修整到实际数据的尺寸大小,以便未使用的内存被释放。
; u* E2 m' l/ G query_cache_min_res_unit 的缺省值为 4 KB,在大多数据情况下已够用了。
! M$ s7 _5 J8 M3 d* k' W 如果你有许多查询返回一个较小的结果,缺省的块尺寸可能会引起内存碎片 (显示为一个很大数量的空闲块(Qcache_free_blocks),这将引起查询缓存不得不因缺乏内存(Qcache_lowmem_prunes)而从缓存中删除查询)。在这种情况下,你应该减少 query_cache_min_res_unit。9 x) s) H- C9 R, F0 W0 i1 D
如果你的主要查询返回的是大的结果集(查看 Qcache_total_blocks 和 Qcache_queries_in_cache),你可以通过增加 query_cache_min_res_unit 来增加性能。然而,要小心不要将它设得太大。
0 t: H1 f6 d, R' H% I: R3 c query_cache_size 为了存储老的查询结果而分配的内存数量 (以字节指定) 。如果设置它为 0 ,查询缓冲将被禁止(缺省值为 0 )。
; i& s. x" D5 x3 y query_cache_type 这个可以被设置为 (只能是数字) 选项 含义
% x+ {+ P4 [) c 0 (OFF, 不缓存或重新得到结果)/ Y0 i8 C$ s3 i( q
1 (ON, 缓存所有的结果,除了 SELECT SQL_NO_CACHE … 查询)! w# z2 S3 s! Q4 p7 L) E0 u7 p3 V
2 (DEMAND, 仅缓存 SELECT SQL_CACHE … 查询)* R! {9 n" W' |6 I, _; a
在一个线程(连接)内,查询缓存的行为可以被改变。句法如下所示:
7 n& ]. m8 B; o1 H QUERY_CACHE_TYPE = OFF | ON | DEMAND QUERY_CACHE_TYPE = 0 | 1 | 2
, c: l' y8 G# E% u* x. Z 选项 含义
/ R; y( D" C4 g$ h* j 0 or OFF 不缓存或重新得到结果
' U9 Q& i7 _, C7 r 1 or ON 缓存所有的结果,除了 SELECT SQL_NO_CACHE … 查询
: ]0 p. x6 [. [0 m 2 or DEMAND 仅缓存 SELECT SQL_CACHE … 查询
5 z8 d* c6 C6 K' v2 U# R; O. V" m 6.9.3 在 SELECT 中的查询缓存选项0 ~0 H5 [4 ~: d9 o. Y, {
有两个可能的查询缓存相关的参数可以在一个 SELECT 查询中被指定:; D4 x& P6 Q6 a5 |6 f3 E! z
选项 含义$ g' R- t2 z" p. V
SQL_CACHE 如果 QUERY_CACHE_TYPE 为 DEMAND,允许该查询被缓存。如果 QUERY_CACHE_TYPE 为 ON,这是缺省的。如果 QUERY_CACHE_TYPE 为 OFF,它不做任何事+ D! p8 D5 Z7 W8 D
SQL_NO_CACHE 使这个查询不被缓存,不允许这个查询被存储到高速缓存中! ^. h ^& B: p
6.9.4 查询缓存的状态和维护
6 m; a: B6 M% J. e; l5 N 使用 FLUSH QUERY CACHE 命令,你可以整理查询缓存,以更好的利用它的内存。这个命令不会从缓存中移除任何查询。FLUSH TABLES 会转储清除查询缓存。
2 S% S7 s/ o! u9 u! F RESET QUERY CACHE 使命从查询缓存中移除所有的查询结果。, D# d" j0 B$ m9 t, m; `$ w, J/ A
你可以检查查询缓存在你的 MySQL 是否被引进:+ z/ {/ o' O. ~+ C/ S% |/ ?! F
mysql> SHOW VARIABLES LIKE 'have_query_cache';
* d. y( r/ H8 C0 w X +------------------+-------+
, {0 u L! E1 w" L5 `! s. F | Variable_name | Value |0 S& o! h$ F# B! m: u* Y' M
+------------------+-------+
! U* [: Z( D }5 Z- F8 K | have_query_cache | YES |; N. T: d* s3 \ M) l
+------------------+-------+
# o& w0 p7 [1 N; h, | V/ B$ ?) r 1 row in set (0.00 sec)' _/ e1 d" T- g( A( b% M) ?
在 SHOW STATUS 中,你可以监视查询缓存的性能:
7 h3 C# w3 }, [8 J% K' v 变量 含义1 l7 s# ?; G! p1 ~1 @
Qcache_queries_in_cache 在缓存中已注册的查询数目
1 X; ?8 e8 n, _, q Qcache_inserts 被加入到缓存中的查询数目
0 M2 i9 Z% Y$ V4 n% ~ Qcache_hits 缓存采样数数目- a k+ `. f% N
Qcache_lowmem_prunes 因为缺少内存而被从缓存中删除的查询数目& m/ A- p2 e; @6 C K4 X K
Qcache_not_cached 没有被缓存的查询数目 (不能被缓存的,或由于 QUERY_CACHE_TYPE)
! j6 `) s' O! I9 l Qcache_free_memory 查询缓存的空闲内存总数
; X% D( M/ }5 X$ \+ ] Qcache_free_blocks 查询缓存中的空闲内存块的数目
4 `* f3 ?" a( `5 n7 g3 K* L Qcache_total_blocks 查询缓存中的块的总数目0 [4 F2 v. |" c: d- m6 m, p
Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached.: f4 v* \& t+ \
查询缓存使用变长的块,因而 Qcache_total_blocks 和 Qcache_free_blocks 可能显示查询缓存的碎片。在 FLUSH QUERY CACHE 之后,只有剩余一个单独的(大的)空闲块。& y6 e3 Y2 j' v
注意:每个查询最小需要两个块(一个用于存储查询文本,另一个或多个用于存储查询结果)。同样的,每个被一个查询使用的表需要一个块,但是,如果有两个或更多的查询使用同一张表,仅仅只需要分配一个块就行了。8 O: m# { N7 x& `
你可以使用状态变量 Qcache_lowmem_prunes 来谐调查询缓存尺寸。它计数被从缓存中移除的查询,该查询的移除是为了释放内存,以缓存新建的查询。查询缓存使用一个 least recently used (LRU) 策略来判断从缓存中移除哪个查询。 |