Я владелец веб-игры с базой данных с большим трафиком и большим количеством запросов.
Сейчас я оптимизирую 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, но я избегаю его, потому что у нас много запросов, которые я не хочу проверять все время.
Увеличение объема памяти также не будет исправлением, поскольку у нас так много запросов.
Затем мне пришла в голову идея сделать cronjob для автоматического СБРОСА кеша запросов, когда lowmem_prunes равен нулю. (что, вероятно, будет один раз в час)
Какой вариант лучше?
1. Автоматически сбрасывать кеш запросов один раз в час
2. Купите больше оперативной памяти и увеличьте кэш, например, на 1 ГБ (у этого есть свои недостатки ... Я бы не стал этого делать)
3. Укажите для каждого запроса, который должен храниться в кеше, в котором нет.
4. Просто держи это так.