配置文件设置缓存

query_cache_size = 20M  #缓存大小
query_cache_type = ON  #开启缓存
table_cache=256    #用于限制缓存表的最大数目,如果当前已经缓存的表未达到table_cache,则会将新表添加进来;若已经达到此值,MySQL将根据缓存表的最后查询时间、查询率等规则释放之前的缓存

查询缓存配置
have_query_cache服务器系统变量指示查询缓存是否可用:YES可用,NO不可用

mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+

要设置查询缓存的大小,请设置 query_cache_size系统变量。将其设置为0将禁用查询缓存。query_cache_type=0禁用查询缓存

设置query_cache_size 为非零值时,请记住查询缓存需要最小大小约为40KB才能分配其结构。(确切的大小取决于系统体系结构。)如果将该值设置得太小,则会收到警告,如以下示例所示:

mysql> SET GLOBAL query_cache_size = 40000;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1282
Message: Query cache failed to set size 39936;
         new query cache size is 0

mysql> SET GLOBAL query_cache_size = 41984;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| query_cache_size | 41984 |
+------------------+-------+

为了使查询缓存实际上能够保存任何查询结果,必须将其大小设置为更大:

mysql> SET GLOBAL query_cache_size = 1000000;
Query OK, 0 rows affected (0.04 sec)

mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| query_cache_size | 999424 |
+------------------+--------+
1 row in set (0.00 sec)

该query_cache_size值与最接近的1024字节块对齐。因此,报告的值可能与您分配的值不同。

如果查询缓存大小大于0,则 query_cache_type变量会影响其工作方式。可以将此变量设置为以下值:

0或OFF 禁用缓存。

1或ON 启用缓存,但以开头的语句除外 SELECT SQL_NO_CACHE。

2或 DEMAND导致仅缓存以开头的语句SELECT SQL_CACHE。

如果query_cache_size为0,则还应该将query_cache_type变量设置 为0。在这种情况下,服务器根本不会获取查询缓存互斥量,这意味着无法在运行时启用查询缓存,并且减少了查询执行的开销。

设置该GLOBAL query_cache_type值可确定更改后连接的所有客户端的查询缓存行为。各个客户端可以通过设置SESSION query_cache_type值来控制自己连接的缓存行为 。例如,客户端可以禁止对自己的查询使用查询缓存,如下所示:

mysql> SET SESSION query_cache_type = OFF;

如果query_cache_type 在服务器启动时(而不是在运行时使用 SET 语句)进行设置,则仅允许数字值。

要控制可缓存的单个查询结果的最大大小,请设置 query_cache_limit系统变量。默认值为1MB。

注意不要将缓存的大小设置得太大。由于在更新过程中需要线程锁定高速缓存,因此您可能会看到高速缓存非常大的锁定争用问题。

注意
SET 通过使用 命令行或配置文件中的选项,
可以使用语句设置 在运行时为查询缓存指定的最大大小 。
 --maximum-query_cache_size=32M
 也可以直接修改my.cnf文件 ,在msqld下直接添加 query_cache_size = 32M

当要缓存查询时,其结果(发送到客户端的数据)将在结果检索期间存储在查询缓存中。因此,通常不会大批量处理数据。查询高速缓存分配块以按需存储此数据,因此当一个块被填充时,将分配一个新块。由于内存分配操作成本高昂(按时间排列),因此查询缓存将分配具有query_cache_min_res_unit 系统变量给定的最小大小的块 。执行查询时,将最后一个结果块修剪为实际数据大小,以便释放未使用的内存。根据服务器执行的查询类型,您可能会发现调整以下值会有所帮助 query_cache_min_res_unit:

默认值为 query_cache_min_res_unit 4KB。对于大多数情况,这应该足够了。

如果您有很多查询但结果很少,则默认的块大小可能会导致内存碎片,这由大量的空闲块指示。由于内存不足,碎片可能会迫使查询缓存从缓存中修剪(删除)查询。在这种情况下,减小的值 query_cache_min_res_unit。由于修剪而删除的空闲块和查询的数量由Qcache_free_blocks和 Qcache_lowmem_prunes 状态变量的值给出 。

如果大多数查询的结果较大(请检查 Qcache_total_blocks和 Qcache_queries_in_cache 状态变量),则可以通过提高来提高性能 query_cache_min_res_unit。但是,请注意不要使其过大

您可以对查询缓存进行碎片整理,以更好地利用该FLUSH QUERY CACHE语句的内存。该语句不会从缓存中删除任何查询。

该RESET QUERY CACHE语句从查询缓存中删除所有查询结果。该 FLUSH TABLES语句也这样做。

要监视查询缓存性能,请使用 SHOW STATUS来查看缓存状态变量:

mysql> SHOW STATUS LIKE 'Qcache%';
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Qcache_free_blocks      | 36     |             #查询缓存中的可用内存块数
| Qcache_free_memory      | 138488 |		     #查询缓存的可用内存量
| Qcache_hits             | 79570  |			 #查询缓存命中数
| Qcache_inserts          | 27087  |			 #添加到查询缓存中的查询数
| Qcache_lowmem_prunes    | 3114   |			 #由于内存不足而从查询缓存中删除的查询数
| Qcache_not_cached       | 22989  |  			 #非缓存查询的数量(不可缓存或由于query_cache_type 设置而未被缓存)。
| Qcache_queries_in_cache | 415    |		     #在查询缓存中注册的查询数
| Qcache_total_blocks     | 912    |			 #查询缓存中的块总数。
+-------------------------+--------+

查询缓存使用可变长度的块,因此 Qcache_total_blocks并 Qcache_free_blocks可能指示查询缓存内存碎片。之后 FLUSH QUERY CACHE,仅剩下一个空闲块。

mysql> flush query cache;
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables;   #清空当前所有缓存的表
Query OK, 0 rows affected (0.00 sec)
mysql> reset query cache; #清理内存中的碎片
Query OK, 0 rows affected (0.00 sec)

每个缓存的查询至少需要两个块(一个用于查询文本,一个或多个用于查询结果)。同样,查询使用的每个表都需要一个块。但是,如果两个或多个查询使用同一张表,则只需要分配一个表块。

Qcache_lowmem_prunesstatus变量 提供的信息 可以帮助您调整查询缓存的大小。它计算从缓存中删除的查询数,以释放内存以缓存新查询。查询缓存使用最近最少使用(LRU)策略来决定从缓存中删除哪些查询。