≫ Профилирование

План запроса

SQL-оператор SHOW PLAN и опция интерфейса JSON "plan": N отображают план выполнения запроса. План генерируется и сохраняется во время фактического выполнения, поэтому в случае SQL профилирование должно быть включено в текущей сессии до выполнения этого оператора. Это можно сделать с помощью оператора SET profiling=1.

В режиме SQL возвращаются два элемента:

  • transformed_tree, который отображает полное текстовое разложение запроса.
  • enabled_indexes, который предоставляет информацию об эффективных вторичных индексах.

Чтобы просмотреть план выполнения запроса в JSON-запросе, добавьте "plan": N к запросу. Результат появится в виде свойства plan в наборе результатов. N может принимать одно из следующих значений:

  • 1 - Отображает только текстовый план корневого узла, аналогичный тому, что возвращается в SQL-запросе SHOW PLAN. Это самая компактная форма.
  • 2 - Отображает только JSON-объект плана, полезный для обработки.
  • 3 - Отображает JSON-объект с текстовым описанием каждого узла. Обратите внимание, что описание дочерних узлов также присутствует и повторяет часть описания родительского узла, что делает всю структуру довольно большой.
‹›
  • SQL
  • JSON
📋
set profiling=1;
select * from hn_small where match('dog|cat') limit 0;
show plan;
‹›
Response
*************************** 1. row ***************************
Variable: transformed_tree
   Value: OR(
  AND(KEYWORD(dog, querypos=1)),
  AND(KEYWORD(cat, querypos=2)))
*************************** 2. row ***************************
Variable: enabled_indexes
   Value:
2 rows in set (0.00 sec)

В некоторых случаях оцениваемое дерево запроса может значительно отличаться от исходного из-за расширений и других преобразований.

‹›
  • SQL
  • JSON
📋
SET profiling=1;
SELECT id FROM forum WHERE MATCH('@title way* @content hey') LIMIT 1;
SHOW PLAN;
‹›
Response
Query OK, 0 rows affected (0.00 sec)
+--------+
| id     |
+--------+
| 711651 |
+--------+
1 row in set (0.04 sec)
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable         | Value                                                                                                                                                                                                                                                                                                                                                                                                                   |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| transformed_tree | AND(
  OR(
    OR(
      AND(fields=(title), KEYWORD(wayne, querypos=1, expanded)),
      OR(
        AND(fields=(title), KEYWORD(ways, querypos=1, expanded)),
        AND(fields=(title), KEYWORD(wayyy, querypos=1, expanded)))),
    AND(fields=(title), KEYWORD(way, querypos=1, expanded)),
    OR(fields=(title), KEYWORD(way*, querypos=1, expanded))),
  AND(fields=(content), KEYWORD(hey, querypos=2))) |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

См. также EXPLAIN QUERY. Он отображает дерево выполнения полнотекстового запроса без фактического выполнения запроса. Обратите внимание, что при использовании SHOW PLAN после запроса к таблице реального времени результат будет основан на случайном дисковом/оперативном фрагменте. Поэтому, если вы недавно изменяли настройки токенизации таблицы или если фрагменты значительно различаются по словарям и т. п., вы можете не получить ожидаемый результат. Учитывайте это и рассмотрите возможность использования EXPLAIN QUERY.

Примечания к JSON-набору результатов

Свойство query содержит преобразованное дерево полнотекстового запроса. Каждый узел содержит:

  • type: тип узла. Может быть AND, OR, PHRASE, KEYWORD и т. д.
  • description: поддерево запроса для этого узла, отображаемое в виде строки (в формате SHOW PLAN).
  • children: дочерние узлы, если есть.
  • max_field_pos: максимальная позиция внутри поля.
  • word: преобразованное ключевое слово. Только для узлов ключевых слов.
  • querypos: позиция этого ключевого слова в запросе. Только для узлов ключевых слов.
  • excluded: ключевое слово исключено из запроса. Только для узлов ключевых слов.
  • expanded: ключевое слово добавлено расширением префикса. Только для узлов ключевых слов.
  • field_start: ключевое слово должно встречаться в самом начале поля. Только для узлов ключевых слов.
  • field_end: ключевое слово должно встречаться в самом конце поля. Только для узлов ключевых слов.
  • boost: IDF ключевого слова будет умножен на это значение. Только для узлов ключевых слов.

Формат Dot для SHOW PLAN

SHOW PLAN format=dot позволяет возвращать дерево выполнения полнотекстового запроса в иерархическом формате, подходящем для визуализации с помощью существующих инструментов, таких как https://dreampuf.github.io/GraphvizOnline:

MySQL [(none)]> show plan option format=dot\G
*************************** 1. row ***************************
Variable: transformed_tree
   Value: digraph "transformed_tree"
{
0 [shape=record,style=filled,bgcolor="lightgrey" label="AND"]
0 -> 1
1 [shape=record,style=filled,bgcolor="lightgrey" label="AND"]
1 -> 2
2 [shape=record label="i | { querypos=1 }"]
0 -> 3
3 [shape=record,style=filled,bgcolor="lightgrey" label="AND"]
3 -> 4
4 [shape=record label="me | { querypos=2 }"]
}

Пример графа SHOW PLAN graphviz

Last modified: August 28, 2025