Sply Splyeff ([info]sply) wrote,
@ 2009-03-13 22:22:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
mysql query cache tips - таблицы преселектов
Мощная штука, но есть одна деталь, сильно уменьшающая пользу от кэша. Любое изменение любой таблицы из запроса выбрасывает все запросы из кэша. Но есть несложный прием, позволяющий за счет некритичной рассинхронизации содержать query cache намного эффективнее. Держать отдельные таблицы в качестве поставщиков данных для самых частых, но не критичных к свежести информации запросов. Которые наполнять с некоторой периодичностью, например, раз в 10 минут. При больших объемах данных можно держать и отдельные pre-selected таблицы по какому-то частому условию. И, конечно, денормировать.

Живой пример. Есть таблица wishes, имеющая поле visible := public | visible | friends-only | private. Когда для незалогиненного юзера (включая поисковых роботов) показывается лента, генерируемая по этой таблице, ко всем запросам добавляется условие public = visible. И запросы такие составляют почти половину от всех.

Убиваем двух зайцев с минимальными изменениями так:
- раз в 30 минут создаем пустую таблицы wishes_public, в которую выбираем все данные из wishes по условию visible = public
- в рельсах создаем новый класс модели WishesPublic
class WishPublic < Wish
set_table_name 'wishes_public'
end
и везде, где показывается публичная часть сайта, вместо класса Wish указывается WishPublic.

Если стремиться к сверхоптимизации, то можно было бы снимать в wishes_public индекс с поля visibe и убирать его из запросов, но это копейки по сравнению с основным эффектом. Разница в скорости селекта - от 4 до 50 раз в зависимости от типа запроса. Плюс к этому эффективность query cache повышается с 10% до 55% cache hit rate.



(6 comments) - (Post a new comment)


[info]b_a_t
2009-03-13 10:30 pm UTC (link)
Хмм.. А чем это отличается концептуально от memcache?

(Reply to this) (Thread)


[info]sply
2009-03-13 11:16 pm UTC (link)
mysql query cache сидит в mysqld с 4, кажется, версии. И для sql-клиента прозрачный. Т.е. цеплять что-то внешнее, сериализовать/десериализовать данные, адаптировать код не нужно. Но хуже контроль над тем, что и как кэшировать.

Edited at 2009-03-13 11:17 pm UTC

(Reply to this) (Parent)(Thread)


[info]knutov
2009-03-14 12:09 am UTC (link)
Кстати, а какой-нибудь аналог times ten для мускля уже сделали? А то что-то анонсов было, а живых проектов не видно.

(Reply to this) (Parent)(Thread)


[info]sply
2009-03-14 12:16 am UTC (link)
какой конкретно функции? libmysqld который цепляется непосредственно к приложению давно есть.

(Reply to this) (Parent)(Thread)


[info]knutov
2009-03-14 12:25 am UTC (link)
все тоже самое, только в памяти, с гарантированным бекендом в реальный мускль.

(Reply to this) (Parent)(Thread)


[info]sply
2009-03-14 12:35 am UTC (link)
про такое не слышал, но я и не очень в курсе новостей

(Reply to this) (Parent)


(6 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…