Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> профилирование запросов в mysql 
V
    Опции темы
skyboy
Дата 24.9.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Итак. Все тормозит, код клиентской части просто идеальный, записей в БД "вроде бы немного". Что делать? Заниматься profiling'ом.
Что для этого есть в mysql?
1. slow query log  - механизм, который производит запись запроса в отдельный лог в том случае, если этот запрос выполнялся дольше указанного периода(в секундах  - минимально 1, по умолчанию стоит 10 секунд). Хорошо эту штуку включить, если она не включена и есть доступ к конфигам - можно уже после обнаружения "тормозов" посмотреть, как система себя раньше "вела" - появились ли сбои по причине увеличения объема данных или проблема была и раньше, просто была незаметна из-за небольшой нагрузки.
2. конструкция explain отображает ход выполнения указанного запроса. надо разобраться с нотацией результатов выполнения этой конструкции, да и информация пригодится только при условии наличия хотя бы базовых знаний о принципе работы СУБД, но здесь лучше разобраться раз и с удовольствием пользоваться.
3. начиная с версии 5.0.37 в mysql появился встроенный profiler, который позволяет в пределах сессиий запоминать время выполнения запросов и по выбранному запросу давать развернутую информацию.
пример выполнения скажет за себя:
Код

SET profiling=1;
SELECT COUNT(*) FROM information_schema.tables;
SHOW profiles;
SHOW profile FOR QUERY 1;

выдает
Цитата

"COUNT(*)"
"265"
// результат выполнения select запроса
"Query_ID"    "Duration"    "Query"
"1"    "0.81741225"    "SELECT COUNT(*) FROM information_schema.tables"
// результат выполнения "show profiles"
"Status"    "Duration"
"(initialization)"    "0.000006"
"checking query cache for query"    "0.0000852"
"checking permissions"    "0.0000102"
"Opening tables"    "0.0003627"
"System lock"    "0.0000057"
"Table lock"    "0.0000412"
"init"    "0.000029"
"optimizing"    "0.0000077"
"statistics"    "0.000016"
"preparing"    "0.0000152"
"executing"    "0.0196215"
"checking permissions"    "0.0000335"
"Opening tables"    "0.0002245"
"removing tmp table"    "0.0000145"
"Opening tables"    "0.000203"
"removing tmp table"    "0.0000135"
"Opening tables"    "0.000081"
"removing tmp table"    "0.0000085"
"Opening tables"    "0.0040647"
"removing tmp table"    "0.0004305"
"Opening tables"    "0.000101"
"removing tmp table"    "0.0000157"
"Opening tables"    "0.000124"
"removing tmp table"    "0.0000132"
"Opening tables"    "0.0000597"
"removing tmp table"    "0.00001"
"Opening tables"    "0.0023357"
"removing tmp table"    "0.0004092"
"Opening tables"    "0.0001157"
"removing tmp table"    "0.0000205"
"Opening tables"    "0.0001132"
"removing tmp table"    "0.0000147"
"Opening tables"    "0.0000805"
"removing tmp table"    "0.0000107"
"Opening tables"    "0.0001055"
"removing tmp table"    "0.0000192"
"Opening tables"    "0.0000852"
"removing tmp table"    "0.0000135"
"Opening tables"    "0.0001012"
"removing tmp table"    "0.0000107"
"Opening tables"    "0.0021872"
"removing tmp table"    "0.0003845"
"Opening tables"    "0.0001282"
"removing tmp table"    "0.000011"
"Opening tables"    "0.001933"
"removing tmp table"    "0.000378"
"checking permissions"    "0.4841377"
"Opening tables"    "0.0001075"
...
// еще 246 раз "opening table" со временем выполнения менее чем 0,00005
...
"Opening tables"    "0.0000405"
"checking permissions"    "0.2855055"
"Sending data"    "0.0007977"
"end"    "0.0000037"
"query end"    "0.0000045"
"freeing items"    "0.0000362"
"closing tables"    "0.000002"
"removing tmp table"    "0.000079"
"closing tables"    "0.0000037"
"logging slow query"    "0.0000015"
// результат выполнения show profile for query 1;

на примере видно: основная задержка - checking permissions(без учета их выполнение заняло бы около 0,05 с)
---------------------
Типичный процесс исправления узких мест вижу таким:
1. Лезем в загодя включенный slow query log и выуживаем долгие запросы.
2. Через любой клиент выполняем эти запросы, предварительно включив профилирование(set profiling=1;)
Выясняем, по какой причине запрос долго выполняется.
3. при помощи explain выясняем, какая именно конструкция приводит к тормозам, если на пункте 2 узким местом оказалось что-то, не имеющее отношения к системе безопасности(checking permissions), передачи данных(sending data) - короче говоря, надо разобраться ещё, что можно ускорить за счет оптимизации запроса, а для чего - надо лезть в конфиги(причем не только mysql сервера).
В принципе, пункты 2 и 3 вполне могут идти в другом порядке.

Добавлено @ 09:24
Если что-то пропустил, прошу дополнить.
PM MAIL   Вверх
skyboy
Дата 2.10.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Век живи – век учись.
В комплекте бинарников mysql идет консольная тулза mysqlslap, назначение которой - эмуляция клиентской загрузки. По сути - инструмент нагрузочного тестирования.
Правда, на хостинге у себя я его не обнаружил, что, пожалуй, оправдано smile
PM MAIL   Вверх
lumega
Дата 26.3.2014, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 13.2.2008

Репутация: нет
Всего: нет



Добавлю, что есть графический инструмент для профилирования - Neor Profile SQL. Позволяет позволяет делать и профилирование и explain. 
user posted image
PM MAIL WWW   Вверх
kaa
Дата 20.4.2015, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



страницей промазал

Это сообщение отредактировал(а) kaa - 20.4.2015, 11:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1219 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.