MySQL медленные запросы со отправленными / проверенными строками, равными 0 - PullRequest
2 голосов
/ 09 августа 2011

У меня есть приложение Rails (v.2.3.8) с базой данных MySQL.В журнале медленных запросов на сервере базы данных имеется большое количество записей, таких как:

# Query_time: 3.471884  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
use prod;
SET timestamp=1312909843;
SELECT * FROM `pages` WHERE (`pages`.`controller` = 'forum_categories' AND `pages`.`action` = 'show')  LIMIT 1;

Обратите внимание, что время запроса составляет 3,47 секунды, а количество отправленных и проверенных строк равно 0.Когда я выполняю этот же запрос с помощью клиента MySQL (как на сервере MySQL, так и на сервере приложений), я получаю результат менее чем за 100 мс.Все необходимые поля таблицы проиндексированы, и в таблице всего 70 записей.Любая идея, почему эти длительные, казалось бы, бесполезные запросы будут выполняться?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Вот пример из журнала медленных запросов:

1 # Time: 030303 0:51:27
2 # User@Host: root[root] @ localhost []
3 # Query_time: 25 Lock_time: 0 Rows_sent: 3949 Rows_examined: 378036
4 SELECT ...

Строка 1 показывает, когда запрос был зарегистрирован, а строка 2 показывает, кто его выполнил.Строка 3 показывает, сколько секунд потребовалось для выполнения, сколько времени она ожидала блокировки таблицы на уровне сервера MySQL (не на уровне механизма хранения) , ...

Будьте осторожны, нечитать слишком много в медленном журнале запросов.Если вы видите один и тот же запрос в журнале много раз, есть большая вероятность, что он медленный и нуждается в оптимизации.Но то, что запрос появляется в журнале, не означает, что он плохой или даже обязательно медленный. Вы можете найти медленный запрос, запустить его самостоятельно и обнаружить, что он выполняется за доли секунды. Отображение в журнале просто означает, что запрос занял много времени;это не значит, что это займет много времени сейчас или в будущем.Существует много причин, по которым запрос может быть медленным иногда и быстрым в другое время:
• Возможно, таблица заблокирована, что привело к ожиданию запроса.Lock_time указывает, как долго запрос ожидал снятия блокировок.
• Возможно, данные или индексы еще не были кэшированы в памяти.Это часто встречается, когда MySQL запускается впервые или не был хорошо настроен.
• Возможно, выполнялся ночной процесс резервного копирования, что замедляло весь дисковый ввод / вывод.
• Возможно, сервер выполнял другие запросы нав то же время, замедляя этот запрос.
В результате вы должны рассматривать медленный журнал запросов как только частичную запись того, что произошло.Вы можете использовать его, чтобы сгенерировать список возможных подозреваемых, но вам необходимо изучить каждого из них более подробно.

Данные были процитированы из книги: «Высокопроизводительный MySQL: оптимизация, резервные копии,Репликация и многое другое, второе издание, Барон Шварц и соавт.Авторские права 2008 O'Reilly Media, Inc., 9780596101718. ”

0 голосов
/ 12 августа 2011

Есть ли у вас индексный ключ для столбца pages.controller и pages.action?

В таблице может быть много записей, и, следовательно, запросу требуется 3,47 секунды для поиска правильной строки один за другим, если выне используйте индексный ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...