我的 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)
您可以使用以下公式分析查询缓存的使用情况:
要计算查询缓存的使用百分比值,您可以使用以下公式:
((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% 可以被缓存满足,因此不必重新执行。
这两个比率由以下两个公式计算:
Qcache_hits/Qcache_inserts
Qcache_inserts/Qcache_prunes
使用比可用内存少的内存会降低性能,但使用比可用内存多的内存会导致性能下降甚至崩溃。一般的资源分配公式是:
memory=key_buffer+(sort_buffer_size+read_buffer_size)*max_connections
Run Code Online (Sandbox Code Playgroud)
事实证明查询缓存大小并不太大。相反,由于 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)