- безусловное чтение это выборка всех записей что ли? это же беда-беда - попробуйте использовать memory tables (или что-то вроде memcached, но это не уровень БД) для временных данных (скажем, хеши сессий) - почитайте про особенности table engines - MyISAM, InnoDB и т.д. - почитайте про типы индексов (Hash, BTree)
из лит-ры могу порекомендовать "High Perfomance Mysql" (O'Reily)
- безусловное чтение это выборка всех записей что ли? это же беда-беда Да, это я в качестве примера случая, когда индекс не даст прироста производительности (т.к. он в этом случае по идее не используется), хотя, встречалось такое, что пример выше - даже не беда, так, печалька...
> В частности, Как определить, какие индексы нужны?
Тестировать. Взять запросы, которые у вас чаще всего выполняются, посмотреть как на них влияют индексы при помощи EXPLAIN. Начать с тех, которые находятся в slow query log
То же и по настройкам: посмотреть какие таблицы используются, какие запросы, подумать как настройки могут на них повлиять, попробовать.
Не всегда можно посмотреть slow query log, т.к. иногда так нагрузят БД, что вообще логи отключаешь, иначе дисковая умирает... Ну или так тормозит, что работать невозможно. (например - порезанная по ресурсам виртуалка) :(
Как посмотреть список всех выполненных запросов отсортированных по частоте, скажем? Или просто всех запросов, если мне код клиентского приложения не доступен?
> Не всегда можно посмотреть slow query log, т.к. иногда так нагрузят БД, что вообще логи отключаешь, иначе дисковая умирает...
Поставьте большое long_query_time: больше умолчальных 10 секунд, много туда не запишется. А вообще он теперь динамический. Включите на небольшое время, посмотрите что там, оптимизируйте, дальше следующие.
> Как посмотреть список всех выполненных запросов отсортированных по частоте, скажем?
Если из slow log - то либо при помощи утилиты mysqldumpslow, либо перенаправив его в таблицу
> Или просто всех запросов, если мне код клиентского приложения не доступен?
Встроенное средство - general query log. Я почему его так легко советую: начиная с версии 5.1 он динамический, то есть его можно включить и выключить в любой момент. Плюс его можно перенаправить в табличку и потом сортировать её как любую другую.
Есть ещё решения, использующие proxy. В этом случае все запросы через него надо пропускать.
добавлю к вышесказанному: - проверьте-настройте размеры буфферов и проч. параметры в my.conf - сделайте один или несколько slave для чтения - mysqlsla готовит отчет на базе slow (и/или general) с самыми тяжелыми запросами. для них и пробуйте индексы и т.д.
Comments 9
- попробуйте использовать memory tables (или что-то вроде memcached, но это не уровень БД) для временных данных (скажем, хеши сессий)
- почитайте про особенности table engines - MyISAM, InnoDB и т.д.
- почитайте про типы индексов (Hash, BTree)
из лит-ры могу порекомендовать "High Perfomance Mysql" (O'Reily)
Reply
- безусловное чтение это выборка всех записей что ли? это же беда-беда
Да, это я в качестве примера случая, когда индекс не даст прироста производительности (т.к. он в этом случае по идее не используется), хотя, встречалось такое, что пример выше - даже не беда, так, печалька...
Книжку посмотрю, спасибо.
Reply
http://shop.oreilly.com/product/9780596101718.do
Reply
я сам всегда ищу последнюю редакцию книг, поэтому как-то не подумал уточнить.
Reply
Тестировать. Взять запросы, которые у вас чаще всего выполняются, посмотреть как на них влияют индексы при помощи EXPLAIN. Начать с тех, которые находятся в slow query log
То же и по настройкам: посмотреть какие таблицы используются, какие запросы, подумать как настройки могут на них повлиять, попробовать.
Reply
Не всегда можно посмотреть slow query log, т.к. иногда так нагрузят БД, что вообще логи отключаешь, иначе дисковая умирает... Ну или так тормозит, что работать невозможно. (например - порезанная по ресурсам виртуалка) :(
Как посмотреть список всех выполненных запросов отсортированных по частоте, скажем? Или просто всех запросов, если мне код клиентского приложения не доступен?
Reply
Поставьте большое long_query_time: больше умолчальных 10 секунд, много туда не запишется. А вообще он теперь динамический. Включите на небольшое время, посмотрите что там, оптимизируйте, дальше следующие.
> Как посмотреть список всех выполненных запросов отсортированных по частоте, скажем?
Если из slow log - то либо при помощи утилиты mysqldumpslow, либо перенаправив его в таблицу
> Или просто всех запросов, если мне код клиентского приложения не доступен?
Встроенное средство - general query log. Я почему его так легко советую: начиная с версии 5.1 он динамический, то есть его можно включить и выключить в любой момент. Плюс его можно перенаправить в табличку и потом сортировать её как любую другую.
Есть ещё решения, использующие proxy. В этом случае все запросы через него надо пропускать.
Reply
- проверьте-настройте размеры буфферов и проч. параметры в my.conf
- сделайте один или несколько slave для чтения
- mysqlsla готовит отчет на базе slow (и/или general) с самыми тяжелыми запросами. для них и пробуйте индексы и т.д.
много полезного есть на http://www.mysqlperformanceblog.com/
Reply
- не использовать триггеры и хранимые процедуры
- для больших выборок вместо многоэтажного JOIN делать выборки по ключу
Reply
Leave a comment