≫ Профилирование
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;*************************** 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;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.
Свойство query содержит преобразованное дерево полнотекстового запроса. Каждый узел содержит:
type: тип узла. Может бытьAND,OR,PHRASE,KEYWORDи т. д.description: поддерево запроса для этого узла, отображаемое в виде строки (в форматеSHOW PLAN).children: дочерние узлы, если есть.max_field_pos: максимальная позиция внутри поля.word: преобразованное ключевое слово. Только для узлов ключевых слов.querypos: позиция этого ключевого слова в запросе. Только для узлов ключевых слов.excluded: ключевое слово исключено из запроса. Только для узлов ключевых слов.expanded: ключевое слово добавлено расширением префикса. Только для узлов ключевых слов.field_start: ключевое слово должно встречаться в самом начале поля. Только для узлов ключевых слов.field_end: ключевое слово должно встречаться в самом конце поля. Только для узлов ключевых слов.boost: IDF ключевого слова будет умножен на это значение. Только для узлов ключевых слов.
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 }"]
}
