25.10 Результаты выполнения запросов Performance Schema
Сервер MySQL способен сохранять информацию о результатах выполнения запросов. Процесс создания результата выполняет преобразование каждого SQL-запроса в нормализованную форму (результат выполнения запроса) и вычисляет значение MD5-хеша (значение хеша результата) из нормализованного результата. Нормализация позволяет группировать и обобщать похожие запросы, предоставляя информацию о типах выполняемых сервером запросов и их частоте. В этом разделе описывается, как происходит создание результатов выполнения запросов, и как это может быть полезно.
Создание результатов выполнения запросов происходит в анализаторе независимо от доступности Performance Schema, чтобы другие компоненты сервера, такие как MySQL Enterprise Firewall и плагины переписывания запросов, имели доступ к результатам выполнения запросов.
Общие концепции результатов выполнения запросов
Когда анализатор получает SQL-запрос, он вычисляет результат выполнения запроса, если это необходимо, что имеет место при выполнении одного из следующих условий:
Включена функция Performance Schema для анализа результатов выполнения запросов
Включен MySQL Enterprise Firewall
Включён плагин переписывания запросов
Значение системной переменной max_digest_length определяет максимальное количество байтов, доступных на сеанс для вычисления нормализованных результатов выполнения запросов. После использования этого количества места во время вычисления результата происходит усечение: большее количество токенов из проанализированного запроса не собирается и не влияет на значение результата. Запросы, отличающиеся только после указанного количества байтов проанализированных токенов, дают одинаковый нормализованный результат выполнения запроса и считаются идентичными при сравнении или агрегировании для статистики результатов выполнения запросов.
Установление системной переменной max_digest_length в ноль отключает создание результатов выполнения запросов, что также отключает функциональность сервера, требующую их.
После вычисления нормализованного запроса вычисляется значение MD5-хеша из него. Кроме того:
Если включен MySQL Enterprise Firewall, он вызывается, и результат выполнения запроса, как он был вычислен, доступен ему.
Если включен любой плагин переписывания запросов, он вызывается, и результат выполнения запроса и значение хеша доступны ему.
Если в Performance Schema включено инструментирование результатов выполнения запросов, он создает копию нормализованного результата выполнения запроса, выделив максимум
performance_schema_max_digest_lengthбайтов для неё. Следовательно, еслиperformance_schema_max_digest_lengthменьше, чемmax_digest_length, копия усекается относительно оригинала. Копия нормализованного результата выполнения запроса хранится в соответствующих таблицах Performance Schema, вместе со значением MD5-хеша, вычисленным из исходного нормализованного запроса. (Если Performance Schema усекает свою копию нормализованного результата выполнения запроса относительно оригинала, он не пересчитывает значение MD5-хеша.)
Нормализация запроса преобразует текст запроса в более стандартизированное представление результата выполнения, сохраняя общую структуру запроса, одновременно удаляя информацию, не существенную для структуры:
Идентификаторы объектов, такие как имена баз данных и таблиц, сохраняются.
Литеральные значения преобразуются в маркеры параметров. Нормализованный запрос не сохраняет информацию, такую как имена, пароли, даты и т. д.
Комментарии удаляются, а пробелы корректируются.
Рассмотрим следующие запросы:
SELECT * FROM orders WHERE customer_id=10 AND quantity>20
SELECT * FROM orders WHERE customer_id = 20 AND quantity > 100
Для нормализации этих запросов анализатор заменяет значения данных на ? и корректирует пробелы. Оба запроса дают одинаковую нормализованную форму, и поэтому считаются “одинаковыми”:
SELECT * FROM orders WHERE customer_id = ? AND quantity > ?
Нормализованный запрос содержит меньше информации, но все ещё представителен для исходного запроса. Другие похожие запросы с различными значениями данных имеют одинаковую нормализованную форму.
Теперь рассмотрим эти запросы:
SELECT * FROM customers WHERE customer_id = 1000
SELECT * FROM orders WHERE customer_id = 1000
В этом случае нормализованные запросы отличаются, потому что идентификаторы объектов отличаются:
SELECT * FROM customers WHERE customer_id = ?
SELECT * FROM orders WHERE customer_id = ?
Если нормализация генерирует запрос, превышающий доступное место в буфере результата выполнения (как определено в max_digest_length), происходит усечение, и текст заканчивается “...”. Длинные нормализованные запросы, которые различаются только частью, следующей за “...”, считаются одинаковыми. Рассмотрим эти запросы:
SELECT * FROM mytable WHERE cola = 10 AND colb = 20
SELECT * FROM mytable WHERE cola = 10 AND colc = 20
Если обрезка происходит сразу после AND, оба запроса имеют такую нормализованную форму:
SELECT * FROM mytable WHERE cola = ? AND ...
В этом случае разница во втором имени столбца теряется, и оба запроса считаются одинаковыми.
Сводки заявок в схеме производительности
В схеме производительности процесс создания сводок заявок включает следующие элементы:
Потребитель
statements_digestв таблицеsetup_consumersуправляет тем, сохраняет ли схема производительности информацию о сводках. См. Потребитель сводки заявок.-
Таблицы событий заявок (
events_statements_current,events_statements_historyиevents_statements_history_long) содержат столбцы для хранения нормализованных сводок заявок и соответствующих значений хэша MD5:DIGEST_TEXT— это текст нормализованной сводки запроса. Это копия исходной нормализованной сводки, вычисленной до максимального размера вmax_digest_lengthбайтах, далее усеченная доperformance_schema_max_digest_lengthбайт при необходимости.DIGEST— это значение хэша MD5, вычисленное из исходного нормализованного запроса.
См. Раздел 25.12.6, «Таблицы событий заявок схемы производительности».
Таблица сводки
events_statements_summary_by_digestпредоставляет агрегированную информацию о сводках заявок. Эта таблица агрегирует информацию для заявок по комбинацииSCHEMA_NAMEиDIGEST. Схема производительности использует значения хэшей MD5 для агрегирования, так как они быстро вычисляются и имеют благоприятное статистическое распределение, что минимизирует коллизии. См. Раздел 25.12.15.3, «Таблицы сводки заявок».
Таблицы событий заявок также содержат столбец SQL_TEXT, который содержит исходный SQL-запрос. Максимальное доступное пространство для отображения запроса по умолчанию составляет 1024 байта. Чтобы изменить это значение, установите системную переменную performance_schema_max_sql_text_length при запуске сервера.
Системная переменная performance_schema_max_digest_length определяет максимальное количество байтов, доступных для каждого запроса для хранения значения сводки в схеме производительности. Однако длина отображения сводок заявок может быть больше размера буфера из-за внутренней кодировки элементов запроса, таких как ключевые слова и литеральные значения. В результате значения, выбранные из столбца DIGEST_TEXT таблиц событий заявок, могут превышать значение performance_schema_max_digest_length.
Таблица сводки events_statements_summary_by_digest предоставляет профиль выполняемых сервером запросов. Она показывает типы выполняемых приложением запросов и их частоту. Разработчик приложения может использовать эту информацию вместе с другой информацией в таблице для оценки характеристик производительности приложения. Например, столбцы таблицы, показывающие время ожидания, время блокировки или использование индекса, могут выделить типы запросов, которые являются неэффективными. Это дает разработчику представление о тех частях приложения, которые требуют внимания.
Таблица сводки events_statements_summary_by_digest имеет фиксированный размер. По умолчанию схема производительности оценивает используемый размер при запуске. Чтобы явно указать размер таблицы, установите системную переменную performance_schema_digests_size при запуске сервера. Если таблица заполнится, схема производительности сгруппирует запросы, у которых значения SCHEMA_NAME и DIGEST не совпадают с существующими значениями в таблице, в специальной строке со значениями SCHEMA_NAME и DIGEST, установленными на NULL. Это позволяет подсчитать все запросы. Однако если специальная строка отвечает за значительный процент выполняемых запросов, может быть желательно увеличить размер таблицы сводки, увеличив performance_schema_digests_size.
Использование памяти для отпечатков заявлений
Для приложений, генерирующих очень длинные заявления, отличающиеся только в конце, увеличение значения max_digest_length позволяет вычислять отпечатки, которые различат заявления, которые в противном случае объединялись бы в один и тот же отпечаток. И наоборот, уменьшение значения max_digest_length заставляет сервер выделять меньше памяти для хранения отпечатков, но увеличивает вероятность объединения длинных заявлений в один и тот же отпечаток. Администраторы должны помнить, что большие значения приводят к соответствующему увеличению требований к памяти, особенно для рабочих нагрузок, включающих большое количество одновременных сеансов (сервер выделяет max_digest_length байт на сеанс).
Как описано ранее, нормализованные отпечатки заявлений, вычисленные анализатором, ограничены максимальным значением max_digest_length байт, в то время как нормализованные отпечатки заявлений, хранящиеся в Performance Schema, используют performance_schema_max_digest_length байт. Следующие соображения по использованию памяти относятся к относительным значениям max_digest_length и performance_schema_max_digest_length:
-
Если
max_digest_lengthменьшеperformance_schema_max_digest_length:Компоненты сервера, кроме Performance Schema, используют нормализованные отпечатки заявлений, занимающие до
max_digest_lengthбайт.Performance Schema не дополнительно усекает нормализованные отпечатки заявлений, которые он хранит, но выделяет больше памяти, чем
max_digest_lengthбайт на каждый отпечаток, что является избыточным.
-
Если
max_digest_lengthравноperformance_schema_max_digest_length:Компоненты сервера, кроме Performance Schema, используют нормализованные отпечатки заявлений, занимающие до
max_digest_lengthбайт.Performance Schema не дополнительно усекает нормализованные отпечатки заявлений, которые он хранит, и выделяет такое же количество памяти, как
max_digest_lengthбайт на каждый отпечаток.
-
Если
max_digest_lengthбольшеperformance_schema_max_digest_length:Компоненты сервера, кроме Performance Schema, используют нормализованные отпечатки заявлений, занимающие до
max_digest_lengthбайт.Performance Schema дополнительно усекает нормализованные отпечатки заявлений, которые он хранит, и выделяет меньше памяти, чем
max_digest_lengthбайт на каждый отпечаток.
Поскольку таблицы событий заявлений Performance Schema могут хранить множество отпечатков, установка performance_schema_max_digest_length меньше, чем max_digest_length позволяет администраторам сбалансировать эти факторы:
Необходимость наличия длинных нормализованных отпечатков заявлений для компонентов сервера за пределами Performance Schema
Множество одновременных сеансов, каждый из которых выделяет память для вычисления отпечатков
Необходимость ограничения использования памяти таблицами событий заявлений Performance Schema при хранении многих отпечатков заявлений
Настройка performance_schema_max_digest_length не зависит от сеанса, она зависит от заявления, и сеанс может хранить несколько заявлений в таблице events_statements_history. Типичное количество заявлений в этой таблице составляет 10 на сеанс, поэтому каждый сеанс потребляет в 10 раз больше памяти, чем указано значением performance_schema_max_digest_length, только для этой таблицы.
Кроме того, существует множество заявлений (и отпечатков), собранных глобально, в первую очередь в таблице events_statements_history_long. Здесь также N хранимых заявлений потребляют N раз больше памяти, чем указано значением performance_schema_max_digest_length.
Для оценки количества памяти, используемой для хранения и вычисления отпечатков SQL-заявлений, используйте оператор SHOW ENGINE
PERFORMANCE_SCHEMA STATUS, или отслеживайте эти инструменты:
mysql> SELECT NAME
FROM performance_schema.setup_instruments
WHERE NAME LIKE '%.sqltext';
+------------------------------------------------------------------+
| NAME |
+------------------------------------------------------------------+
| memory/performance_schema/events_statements_history.sqltext |
| memory/performance_schema/events_statements_current.sqltext |
| memory/performance_schema/events_statements_history_long.sqltext |
+------------------------------------------------------------------+
mysql> SELECT NAME
FROM performance_schema.setup_instruments
WHERE NAME LIKE 'memory/performance_schema/%.tokens';
+----------------------------------------------------------------------+
| NAME |
+----------------------------------------------------------------------+
| memory/performance_schema/events_statements_history.tokens |
| memory/performance_schema/events_statements_current.tokens |
| memory/performance_schema/events_statements_summary_by_digest.tokens |
| memory/performance_schema/events_statements_history_long.tokens |
+----------------------------------------------------------------------+
© 2025 Oracle
Licensed under the GPLv2 License.