≫ Профилирование
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 }"]
}
