Jump to content
  • 0

Кэширование MySQL


Veseloff
 Share

Question

Итак, тут попался сайт один на «улучшение», который изрядно заполнился контентом и стал жутко тормозить. Сделан сайт «так себе» — руки программиста росли не совсем из того места, и прикручивать туда кэширование блоков и шаблонов будет дольше, чем написать его с нуля. Посмотрел что именно тормозит — тормозят запросы в мускуль. Есть там лютые джоины, которые по 0.5-2 секунды работают. Доступа к настройкам MySQL сервера нету из-за хостера, площадку и тариф менять они не хотят. Оптимизировать БД тоже особо без толку — все индексы на месте, но сама архитектура хромает. Переделывать архитектуру ­≈ написать всё с нуля. Из-за некоторых особенностей memcached неприменим. И вот я задумался о кэшировании результатов запросов. Алгоритм мне в голову пришёл такой:

1. Делаем запрос в БД, получаем результат, формируем массив из записей.

2. Берём md5 от текста запроса

3. Делаем serialize результата, сохраняем его в файл с названием %md5 из третего пункта%. Конских размеров файла не будет — результаты запросов все не особо длинные, просто сами запросы плохие.

4. При следующей выборке проверяем существование файла с именем %хэшем текста запроса% и, если он есть, то делаем unserialize и отдаём результат.

Нормальный вариант или можно как-то лучше, проще, быстрее?

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Я на Joomla как то ставил плагин, который работает по такому принципу. Но только там данные не сеарилизовались, а использовался PHP Accelerator и данные кэшировались в опкоде. Прирост в быстродействии был ощутимый.

Link to comment
Share on other sites

  • 0
Итак, тут попался сайт один на «улучшение», который изрядно заполнился контентом и стал жутко тормозить. Сделан сайт «так себе» — руки программиста расли не совсем из того места, и прикручитивать туда кэширование блоков и шаблонов будет дольше, чем написать его с нуля. Посмотрел что именно тормозит — тормозят запросы в мускуль. Есть там лютые джоины, которые по 0.5-2 секунды работают. Доступа к настройкам MySQL серера нету из-за хостера, площадку и тариф менять они не хотят. Оптимизировать БД тоже особо без толку — все индексы на месте, но сама архитектура хромает. Переделывать архитектуру ­≈ написать всё с нуля. Из-за некоторых особенностей memcached неприменим. И вот я задумался о кэшировании результатов запросов. Алгоритм мне в голову пришёл такой:

1. Делаем запрос в БД, получаем разультат, формируем массив из записей.

2. Берём md5 от текста запроса

3. Делаем serialize результата, сохраняем его в файл с названием %md5 из третего пункта%. Конских размеров файла не будет — результаты запросов все не особо длинные, просто сами запросы плохие.

4. При следующей выборке проверяем существование файла с именем %хэшем текста запроса% и, если он есть, то делаем unserialize и отдаём результат.

Нормальный вариант или можно как-то лучше, проще, быстрее?

Абсолютно нормальный способ кеширования.

Link to comment
Share on other sites

  • 0
Если запросы дословно одинаковые, то mysql закэширует их сам, более того, он гораздо лучше разберётся с инвалидацией этого кэша.

Да, я об этом прекрасно знаю. И вообще, по-хорошему, настройки сервера можно (и нужно) «подстроить» под железо, под конкретные запросы, вынести кой-чего в tmpfs... Но не всегда это всё настраивается так, как это хочется клиенту. Особенно на площадках виртуального хостинга, где всё общее. Всем спасибо за ответы. Пожалуй, так и поступлю, если еще что-то не придумаю за выходные.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy