EXPLAIN в Mysql

Для анализа медленных запросов в Mysql используется инструкция EXPLAIN:

EXPLAIN [запрос]

Пример анализа запроса, использующего индекс:

EXPLAIN select * from users where email = 'golotyuk@gmail.com';
+----+-------------+-------+-------+---------------+-------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key   | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+-------+------+-------+
|  1 | SIMPLE      | users | const | email         | email | 767     | const |    1 |       |
+----+-------------+-------+-------+---------------+-------+---------+-------+------+-------+

# Значение в колонке rows = 1, что хорошо

Внимание стоит обратить на колонку key — в ней должно быть название индекса, который использует Mysql для выборки. Колонка rows покажет количество обработанных строк (должно быть очень маленьким — десятки...сотни).

Пример EXPLAIN для медленного запроса:

EXPLAIN select * from users where email like '%golotyuk%';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | users | ALL  | NULL          | NULL | NULL    | NULL | 2154 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

Как видим, индекса нет и количество обработанных строк очень большое. В указанном примере индексы не помогут, т.к. используется LIKE с фильтром справа и слева. Однако в большинстве случаев, проблема всегда связана с отсутствием индексов.

Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень