Ваш вопрос довольно общий, поэтому я отвечу на ваши конкретные вопросы, а затем отправлю вам, где вы сможете найти дополнительную информацию.
Объяснения в журналах в порядке, но вы не одиноки в том, что не можете их прочитать. Используйте журналы, чтобы идентифицировать ваши медленные запросы. Используйте EXPLAIN
позже (и другие инструменты) для отладки происходящего. Хорошо иметь его в журнале, но, пожалуйста, отформатируйте его вживую в вашей базе данных, чтобы улучшить читабельность:
![EXPLAIN USAGE](https://i.stack.imgur.com/4C6rm.jpg)
Отвечая на ваши вопросы:
Как узнать, не используется ли индекс?
type
(и key
) столбцы скажут вам. тип ALL
означает, что используется полное сканирование таблицы, и возможные ключи / клавиши будут NULL
. Это для сканирования. тип const
, ref
или range
обычно предпочтительнее (есть больше стратегий). Для сортировки (и других вопросов) вы найдете на Extra:
строку Using filesort
. Это означает, что необходим второй проход для сортировки результатов, а в некоторых случаях индекс поможет получать результаты автоматически по порядку.
Вот пример другого запроса, на этот раз с использованием индекса:
![query using an index](https://i.stack.imgur.com/ymnkn.jpg)
Это упрощение, поскольку существует множество способов использования индекса для ускорения результатов (ICP, охватывающий индекс, max (), ...).
Здесь недостаточно места, чтобы поговорить также о JOIN
s и подзапросах, где порядок и переписывание позволяют получить лучшие стратегии.
Как определить медленные части, к которым они запрашивают?
Есть 2 варианта:
профилирование запроса (который даст вам время, затрачиваемое на каждый этап запроса), что можно сделать с помощью show profile
или включить его с помощью performance_schema
для определенных запросов. Типичный выход:
SHOW PROFILE CPU FOR QUERY 5;
+----------------------+----------+----------+------------+
| Status | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| starting | 0.000042 | 0.000000 | 0.000000 |
| checking permissions | 0.000044 | 0.000000 | 0.000000 |
| creating table | 0.244645 | 0.000000 | 0.000000 |
| After create | 0.000013 | 0.000000 | 0.000000 |
| query end | 0.000003 | 0.000000 | 0.000000 |
| freeing items | 0.000016 | 0.000000 | 0.000000 |
| logging slow query | 0.000003 | 0.000000 | 0.000000 |
| cleaning up | 0.000003 | 0.000000 | 0.000000 |
+----------------------+----------+----------+------------+
статистика обработчика , которая даст вам независимый от времени показатель стратегии сканирования и количество строк, отсканированных для каждой из них:
![Handler statistics](https://i.stack.imgur.com/B3E0a.jpg)
Последний вариант может показаться немного недружественным, но как только вы его поймете, вы сможете легко увидеть использование индекса и полное сканирование, зная, какие внутренние вызовы движка.
Есть ли ярлык для быстрой идентификации отсутствующих индексов?
Да, если вы включили performance_schema
и имеете доступ к базе данных sys
, 1080 * предоставит вам столбец с именем "full_scan
", который даст вам запросы, которые выполняют полное сканирование (сканирование без использования индексов). , Затем вы можете заказать по rows_examined
, rows_examined_avg
, avg_latency
и т. Д. В порядке важности.
Если вы не хотите или не можете использовать performance_schema, используйте журналы, чтобы получить эти числа, агрегированные с pt-query-digest
из percona-toolkit :
![pt-query-digest](https://i.stack.imgur.com/pOaSq.jpg)
Если проверенные строки очень велики по сравнению с отправленными строками, вероятно, причиной является индекс.
Таким образом, журналы подходят для идентификации запросов - используйте их, чтобы объединить их с performance_schema или pt-query-digest. Но как только вы определили худшие запросы, используйте для отладки другие инструменты.
Более подробно я расскажу о том, как идентифицировать медленные запросы, и о том, как оптимизировать запросы на моих слайдах. " Оптимизация запросов с MySQL 8.0 и MariaDB 10.3 " . Я делаю это для жизни, и оптимизация запросов - моя страсть, я предлагаю вам взглянуть на них (я не продаю вам книги, они бесплатные и с лицензией Creative Commons).