Назад | Перейти на главную страницу

Настройка кеша запросов mysql

Я изучаю настройку кеша запросов на mysql на моем VPS [настройка 360 МБ]. Когда я начинал, он был установлен на 32 МБ, и я получал нетривиальное количество qcache_lowmem_prunes. Я добавил задание cron для периодического запуска FLUSH QUERY CACHE, что помогло, но недостаточно. Я постепенно увеличивал его, но даже на 80MB [я временно убрал часть памяти из php-cgi], я все еще вижу чернослив lowmem.

OTOH, у меня коэффициент попадания только около 50% [т.е. Qcache_hits составляет примерно половину от Qcache_hits + Com_select]. Я сильно подозреваю, что многие из моих запросов являются одноразовыми и поэтому не должны кэшироваться. Я хотел бы идентифицировать их и пометить их с помощью SQL_NO_CACHE.

Есть предложения по простому способу сделать это?

Также возможно, что некоторые из моих запросов не кэшируются, поскольку таблицы изменились, хотя я не думаю, основываясь на грубой ментальной модели, что это так. По крайней мере, результаты должны быть согласованными для большинства запросов; Я использую InnoDB, поэтому я понимаю, что случайное ОБНОВЛЕНИЕ не обязательно аннулирует все SELECT. Это верно?

Я не понимаю, почему вы хотите очистить кеш. Он сам о себе позаботится, и нет никакого улучшения производительности (которое я видел) от периодической промывки. Коэффициент попадания в кеш 50% на самом деле довольно впечатляющий.

Любое обновление любой строки в таблице делает недействительными все запросы, которые использовали эту таблицу. Это означает, что все запросы, которые к нему присоединяются, удаляются. Неважно, повлияет ли результат на результат или нет.

Я предлагаю вместо этого использовать решение для кеширования, такое как memcached, где у вас есть более точный контроль над тем, что кэшируется и как истекает срок действия данных.

Если вы наблюдаете проблемы с производительностью, возможно, вам лучше отказаться от памяти, связанной с кешем запросов, и увеличить innodb_buffer_pool и innodb_additional_mem_pool_size.

http://dev.mysql.com/doc/refman/5.0/en/innodb-configuration.html

Также вам следует взглянуть на тюнер mysql: https://launchpad.net/mysqltuner/

Вы можете создать триггер MySQL для анализа входящих запросов на лету и переписать его с помощью query_cache var.

Это потребует больше ресурсов ЦП, но не обращайте внимания на источник программного обеспечения.

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html