我是一个网络游戏的拥有者,拥有一个包含大量查询的高流量数据库。 我现在正在优化mySQL和像mysqltuner这样的工具,一直说我没有足够的查询缓存。
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 218 |
| Qcache_free_memory | 109155712 |
| Qcache_hits | 60955602 |
| Qcache_inserts | 38923475 |
| Qcache_lowmem_prunes | 100051 |
| Qcache_not_cached | 10858099 |
| Qcache_queries_in_cache | 19384 |
| Qcache_total_blocks | 39134 |
+-------------------------+-----------+
从运行服务器大约1.5天开始。 理想情况下,lowmem_prunes当然是0,但是有很多查询是基于用户的。喜欢,
SELECT username FROM users WHERE id='1';
SELECT username FROM users WHERE id='12';
SELECT username FROM users WHERE id='12453';
SELECT username FROM users WHERE id='122348';
由于我每天有大约3000名不同的用户登录,因此内存中会有很多这样的查询。
我知道ON DEMAND规则,但我正在避免它,因为我们有很多查询,我不想全部检查。
增加内存也不会解决问题,因为我们有很多查询。
然后我想出了当lowmem_prunes为零时使cronjob自动重置查询缓存的想法。 (可能每小时一次)
什么是最佳选择?
1.每小时自动重置一次查询缓存
2.购买更多内存并增加1GB的缓存(这有它的缺点......我宁愿不这样做)
3.指定应保存在缓存中的每个查询,而不是
只要保持这样。