Spec-Zone.ru › MySQL Workbench

7.5 Учебник: Использование Explain для повышения производительности запросов

В этом учебнике описывается, как использовать отчеты Explain для поиска и исправления проблемных (медленных) запросов. Он использует базу данных DBT-3 и начинается с простого примера запроса.

SELECT * FROM orders
WHERE YEAR(o_orderdate) = 1992 AND MONTH(o_orderdate) = 4
AND o_clerk LIKE '%0223';

Как показано на рисунке ниже, пример запроса был сначала выполнен в визуальном редакторе SQL. Затем отчет Explain был сгенерирован щелчком по Explain Current Statement в меню Query. Начальный отчет отображает визуальное изображение Explain с информацией, которая появляется, когда вы перемещаете указатель над таблицей orders в полном сканировании таблицы.

Рисунок 7.9 Учебник по Explain DBT-3: Визуальное Explain с полным сканированием таблицы

Content is described in the surrounding text.

По желанию, можно переключиться на табличное Explain, как показано на следующем рисунке. Используйте раскрывающийся список для переключения между визуальным и табличным представлениями.

Рисунок 7.10 Учебник по Explain DBT-3: Табличное Explain с полным сканированием таблицы

Content is described in the surrounding text.

Вопросы по запросу:

  • Почему этот запрос сгенерировал полное сканирование таблицы?

  • Почему индексированный столбец o_orderdate отсутствует в качестве возможного ключа?

Более подробно, обратите внимание, что индексированный столбец используется в выражении как "WHERE YEAR(o_orderdate) = 1992 AND MONTH(o_orderdate) = 4", поэтому индекс не используется. Для использования существующего индекса можно скорректировать запрос следующим образом.

SELECT * FROM orders
WHERE o_orderdate BETWEEN '1992-04-01' AND '1992-04-30'
AND o_clerk LIKE '%0223';

Обновленный пример запроса приводит к визуальному изображению Explain, в котором Index Range Scan заменяет Full Table Scan, сгенерированное последним примером запроса. Два следующих рисунка показывают визуальное и табличное представление измененного примера запроса.

Рисунок 7.11 Учебник по Explain DBT-3: Визуальное Explain с индексным диапазонным сканированием

Content is described in the surrounding text.

Рисунок 7.12 Учебник по Explain DBT-3: Табличное Explain с индексным диапазонным сканированием

Content is described in the surrounding text.

Обратите внимание на различия. Тип изменился с ALL на range, возможные ключи (и используемый ключ) изменились с NULL на i_o_orderdate, а количество просканированных строк изменилось с 1,5 миллиона до примерно 33 тысяч. Тем не менее, сканирование 33 тысяч строк при возвращении всего 18 избыточно, поэтому внимание можно переключить на столбец o_clerk. Следующий пример запроса (и табличный рисунок Explain) добавляет следующий индекс, который должен улучшить производительность.

CREATE INDEX i_o_clerk ON orders(o_clerk);

Рисунок 7.13 Учебник по Explain DBT-3: Табличное Explain с индексным диапазонным сканированием и после индекса

Content is described in the surrounding text.

Новый индекс не рассматривается как возможный ключ, потому что запрос ищет суффикс столбца o_clerk, а индексы не работают с суффиксами (хотя они работают с префиксами). Вместо этого этот простой пример мог бы использовать весь идентификатор сотрудника. Корректировка запроса следующим образом показывает лучшие результаты.

SELECT * FROM orders
WHERE o_orderdate BETWEEN '1992-04-01' AND '1992-04-30'
AND o_clerk LIKE 'Clerk#000000223';

Следующие рисунки представляют эффект обновленного примера запроса в визуальном Explain и табличном Explain соответственно.

Рисунок 7.14 Учебник по Explain DBT-3: Визуальное Explain с индексным диапазонным сканированием и полным ID

Content is described in the surrounding text.

Рисунок 7.15 Учебник по Explain DBT-3: Табличное Explain с индексным диапазонным сканированием и полным ID

Content is described in the surrounding text.

Новый индекс o_clerk был учтен и использован, и запрос просканировал 1546 строк вместо 32642, а выполнение запроса улучшилось с 0,281 до 0,234 секунды. Однако EXPLAIN оценивает, что этот запрос просканирует 1546 строк для возвращения 18. После повторного анализа запроса следует учесть, что индекс из нескольких столбцов может удовлетворить условиям предложения WHERE, которое основано на столбцах o_orderdate и o_clerk, как показано в следующем операторе.

CREATE INDEX io_clerk_date ON orders(o_clerk, o_orderdate)
Примечание

o_clerk отображается как первый столбец в индексе, потому что o_orderdate использует диапазон.

Теперь выполнение скорректированного запроса дает еще лучшие результаты. Оценивается, что 18 строк будут просканированы и возвращены, а время выполнения примера запроса составляет 0,234 секунды, как показано на следующих рисунках визуального Explain и табличного Explain.

Рисунок 7.16 Учебник по Explain DBT-3: Визуальное Explain с индексным диапазонным сканированием по нескольким столбцам

Content is described in the surrounding text.

Рисунок 7.17 Учебник по Explain DBT-3: Табличное Explain с индексным диапазонным сканированием по нескольким столбцам

Content is described in the surrounding text.

Следующая таблица обобщает результаты модификаций запроса, выполненных в этом учебнике.

Таблица 7.2 Сравнение запросов учебника Explain DBT-3

Таблица 7.2 Сравнение запросов учебника Explain DBT-3
Тип Возможные ключи Ключ Просканированные строки Время (секунды) Дополнительная информация Возвращенные строки
all NULL NULL 1.50 млн 1.201 Использование where 18
range i_o_orderdate i_o_orderdate 32642 0.281 Использование условия индекса; Использование where 18
range i_o_orderdate, i_o_clerk i_o_clerk 1546 0.234 Использование условия индекса; Использование where 18
range i_o_orderdate, i_o_clerk, i_o_clerk_date i_o_clerk_date 18 0.234 Использование условия индекса 18

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/workbench-en/wb-tutorial-visual-explain-dbt3.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API