优化 MySQL query_cache_size

kid*_*bot 7 mysql

我的 query_cache_size 是不是太大了?

mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| have_query_cache             | YES       |
| query_cache_limit            | 4194304   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 201326592 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+
6 rows in set (0.00 sec)

mysql> SHOW STATUS LIKE '%qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 26643     |
| Qcache_free_memory      | 83199168  |
| Qcache_hits             | 327606097 |
| Qcache_inserts          | 19231291  |
| Qcache_lowmem_prunes    | 10628400  |
| Qcache_not_cached       | 36215     |
| Qcache_queries_in_cache | 92389     |
| Qcache_total_blocks     | 212195    |
+-------------------------+-----------+
8 rows in set (0.00 sec)

mysqlreport says:

__ Query Cache _________________________________________________________
Memory usage  109.13M of 192.00M  %Used:  56.84
Block Fragmnt  12.55%
Hits          327.76M   812.1/s
Inserts        19.24M    47.7/s
Insrt:Prune    1.81:1    21.3/s
Hit:Insert    17.04:1
Run Code Online (Sandbox Code Playgroud)

Gop*_*ath 7

您可以使用以下公式分析查询缓存的使用情况:

当前大小与最大可用大小相比:

要计算查询缓存的使用百分比值,您可以使用以下公式:

((query_cache_size-Qcache_free_memory)/query_cache_size)*100
Run Code Online (Sandbox Code Playgroud)

查询缓存命中率:

缓存的百分比命中率可以计算如下:

((Qcache_hits/(Qcache_hits+Qcache_inserts+Qcache_not_cached))*100)
Run Code Online (Sandbox Code Playgroud)

例如,33% 的用法表示在所有执行的 select 语句中,其中 33% 可以被缓存满足,因此不必重新执行。

点击插入比率和插入修剪比率

这两个比率由以下两个公式计算:

  1. Qcache_hits/Qcache_inserts
  2. Qcache_inserts/Qcache_prunes

不要分配太多内存

使用比可用内存少的内存会降低性能,但使用比可用内存多的内存会导致性能下降甚至崩溃。一般的资源分配公式是:

memory=key_buffer+(sort_buffer_size+read_buffer_size)*max_connections
Run Code Online (Sandbox Code Playgroud)


kid*_*bot 5

事实证明查询缓存大小并不太大。相反,由于 query_cache_min_res_unit 太大,查询没有被缓存。

通过将其减少到接近平均查询大小的 1024,我最终不得不增加 query_cache_size,现在得到以下结果。

Memory usage  249.07M of 256.00M  %Used:  97.29
Block Fragmnt   1.05%
Hits           12.34M   789.6/s
Inserts       574.80k    36.8/s
Insrt:Prune    4.72:1    29.0/s
Hit:Insert    21.47:1
Run Code Online (Sandbox Code Playgroud)