Мониторинг производительности Базы данных Azure для MySQL с помощью хранилища запросов
ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для MySQL — отдельный сервер
Внимание
База данных Azure для MySQL один сервер находится на пути выхода на пенсию. Настоятельно рекомендуется выполнить обновление до База данных Azure для MySQL гибкого сервера. Дополнительные сведения о миграции на гибкий сервер База данных Azure для MySQL см. в статье "Что происходит с одним сервером База данных Azure для MySQL?"
Область применения: База данных Azure для MySQL 5.7, 8.0
Компонент "Хранилище запросов" в Базе данных Azure для MySQL позволяет отслеживать производительность запросов с течением времени. Хранилище запросов упрощает устранение неполадок, позволяя быстро выявлять самые медленные и ресурсоемкие запросы. Хранилище запросов автоматически ведет журнал запросов и статистики выполнения и сохраняет их для просмотра. Этот компонент разделяет данные по периодам, давая представление о закономерностях использования баз данных. Данные для всех пользователей, баз данных и запросов хранятся в базе данных схемы mysql в экземпляре Базы данных Azure для MySQL.
Распространенные сценарии использования хранилища запросов
Хранилище запросов можно использовать во многих сценариях, включая следующие:
- обнаружение регрессивных запросов;
- определение числа выполнений запроса за данный период времени;
- сравнение среднего времени выполнения запроса за периоды времени для выявления больших расхождений;
Включение хранилища запросов
Хранилище запросов является дополнительной функцией, поэтому оно не активно на сервере по умолчанию. Хранилище запросов включается или отключается глобально для всех (но не для отдельных) баз данных на данном сервере.
Включение хранилища запросов с помощью портала Azure
- Войдите на портал Azure и выберите сервер Базы данных Azure для MySQL.
- В разделе меню Параметры выберите Параметры сервера.
- Найдите параметр query_store_capture_mode.
- Задайте для него значение "ALL" и щелкните Сохранить.
Чтобы включить статистику ожидания в хранилище запросов, сделайте следующее.
- Найдите параметр query_store_wait_sampling_capture_mode.
- Задайте для него значение "ALL" и щелкните Сохранить.
Подождите около 20 минут, пока первый набор данных не сохранится в базе данных mysql.
Данные в хранилище запросов
Хранилище запросов включает два хранилища:
- хранилище статистики времени выполнения для хранения статистических сведений о выполнении запросов;
- хранилище статистики ожидания для хранения статистических сведений об ожидании.
С целью экономии места к статистическим данным о выполнении запросов в хранилище статистики времени выполнения применяется агрегирование за фиксированный настраиваемый период. Сведения в этих хранилищах отображаются путем запроса представлений хранилища запросов.
Следующий запрос возвращает сведения о запросах в хранилище запросов:
SELECT * FROM mysql.query_store;
Это запрос статистики ожидания:
SELECT * FROM mysql.query_store_wait_stats;
Поиск запросов ожидания
Примечание.
Сбор статистики ожидания не следует включать в часы пиковой рабочей нагрузки или же его следует включить на неограниченное время только для конфиденциальных рабочих нагрузок.
Для рабочих нагрузок, работающих с высокой загрузкой ЦП или на серверах с пониженным числом виртуальных ядер, будьте внимательны при включении сбора статистики ожидания. Ее не стоит включать на неограниченное время.
Типы событий ожидания объединяют разные события ожидания в группы по принципу сходства. Хранилище запросов предоставляет тип события ожидания, имя определенного события ожидания и запрашиваемый запрос. Возможность сопоставлять эти сведения об ожидании со статистикой времени выполнения запроса позволяет получить более глубокое понимание аспектов, влияющих на характеристики производительности запросов.
Ниже приведены некоторые примеры получения более подробных сведений о рабочей нагрузке с помощью статистики ожидания в хранилище запросов.
Наблюдение | Действие |
---|---|
Ожидания с высоким уровнем блокировки | Проверьте текст затронутых запросов и выявите целевые сущности. Найдите в хранилище запросов другие запросы, изменяющие ту же сущность, которые часто выполняются и (или) имеют большую длительность. Найдя такие запросы, рекомендуется изменить логику приложения, чтобы улучшить параллелизм, или использовать менее строгий уровень изоляции. |
Ожидания с большим числом операций ввода-вывода буфера | Найдите в хранилище запросов запросы с большим числом физических операций чтения. Если они соответствуют запросам с высокими значениями ожидания ввода-вывода, попробуйте ввести индекс для базовой сущности, чтобы задать поиск вместо сканирования. Это позволит свести к минимуму затраты на операции ввода-вывода запросов. Ознакомьтесь с рекомендациями по повышению производительности серверов на портале: возможно, для этого сервера есть рекомендации по индексам, которые позволят оптимизировать запросы. |
Ожидания с высокой загрузкой памяти | Найдите в хранилище запросов те запросы, которые используют больше всего памяти. Вероятнее всего, эти запросы препятствуют дальнейшей обработке затронутых запросов. Ознакомьтесь с рекомендациями по повышению производительности для сервера на портале: возможно, есть рекомендации по индексам, которые позволят оптимизировать запросы. |
Варианты конфигурации
При включении хранилища запросов оно сохраняет данные с 15-минутным периодом агрегирования: не более 500 уникальных запросов на период.
Ниже приведены настраиваемые параметры для хранилища запросов.
Параметр | Description | По умолч. | Диапазон |
---|---|---|---|
query_store_capture_mode | Включение или отключение функции хранилища запросов в зависимости от значения. Примечание. Если performance_schema имеет значение OFF, включение query_store_capture_mode включает performance_schema и подмножество инструментов схемы производительности, необходимых для этой функции. | ВСЕ | NONE, ALL |
query_store_capture_interval | Интервал записи в хранилище запросов в минутах. Позволяет указать интервал агрегирования метрик запросов. | 15 | 5–60 |
query_store_capture_utility_queries | Включение или отключение сбора статистики всех запросов служебной программы, которые выполняются в системе. | Нет | YES, NO |
query_store_retention_period_in_days | Период времени в днях для хранения данных в хранилище запросов. | 7 | 1–30 |
Следующие параметры применяются исключительно к статистике ожидания.
Параметр | Description | По умолч. | Диапазон |
---|---|---|---|
query_store_wait_sampling_capture_mode | Позволяет включить и отключить сбор статистики ожидания. | NONE | NONE, ALL |
query_store_wait_sampling_frequency | Изменяет частоту выборки времени ожидания в секундах. 5–300 секунд. | 30 | 5–300 |
Примечание.
В настоящее время query_store_capture_mode заменяет эту конфигурацию, то есть для сбора статистики ожидания нужно присвоить query_store_capture_mode и query_store_wait_sampling_capture_mode значение ALL. Если параметр query_store_capture_mode отключен, то сбор статистики ожидания отключается, так как эта функция использует включенный параметр performance_schema и значение query_text, записанное в хранилище запросов.
Используйте портал Azure или Azure CLI, чтобы получить значение для параметра или задать другое значение.
Представления и функции
Просмотр и управление хранилищем запросов осуществляеются с помощью следующих представлений и функций. Любой пользователь с ролью select privilege public может использовать эти представления для просмотра данных в хранилище запросов. Эти представления доступны только в базе данных mysql.
Запросы нормализованы: обратите внимание на их структуру после удаления литералов и констант. Если два запроса идентичны, за исключением литеральных значений, они будут иметь один хэш.
mysql.query_store
Это представление возвращает все данные в хранилище запросов. Для каждого отдельного идентификатора базы данных, идентификатора пользователя и идентификатора запроса используется отдельная строка.
Имя | Тип данных | IS_NULLABLE | Description |
---|---|---|---|
schema_name |
varchar(64) | Нет | Имя схемы. |
query_id |
bigint(20) | Нет | Уникальный идентификатор, сформированный для конкретного запроса. Если тот же запрос выполняется в другой схеме, создается новый идентификатор. |
timestamp_id |
TIMESTAMP | Нет | Метка времени выполнения запроса. Она основана на значении query_store_interval. |
query_digest_text |
longtext | Нет | Нормализованный текст запроса после удаления всех литералов. |
query_sample_text |
longtext | Нет | Первое вхождение фактического запроса с литералами. |
query_digest_truncated |
bit | Да | Указывает, был ли текст запроса усечен. Если длина запроса превышает 1 КБ, будет указано значение YES. |
execution_count |
bigint(20) | Нет | Количество выполнений запроса для этого идентификатора метки времени или в течение заданного периода времени. |
warning_count |
bigint(20) | Нет | Число предупреждений, созданных во время указанного периода. |
error_count |
bigint(20) | Нет | Количество ошибок, созданных этим запросом в течение указанного периода. |
sum_timer_wait |
двойной точности | Да | Общее время выполнения этого запроса в миллисекундах |
avg_timer_wait |
двойной точности | Да | Среднее время выполнения этого запроса в миллисекундах |
min_timer_wait |
двойной точности | Да | Минимальное время выполнения этого запроса в миллисекундах |
max_timer_wait |
двойной точности | Да | Максимальное время выполнения в миллисекундах |
sum_lock_time |
bigint(20) | Нет | Общее время, затраченное на все блокировки при выполнении этого запроса в течение указанного периода времени. |
sum_rows_affected |
bigint(20) | Нет | количество затронутых строк. |
sum_rows_sent |
bigint(20) | Нет | Количество строк, отправленных в клиент. |
sum_rows_examined |
bigint(20) | Нет | Число проверенных строк. |
sum_select_full_join |
bigint(20) | Нет | Число полных объединений. |
sum_select_scan |
bigint(20) | Нет | Количество поисков с помощью инструкции SELECT. |
sum_sort_rows |
bigint(20) | Нет | Количество отсортированных строк. |
sum_no_index_used |
bigint(20) | Нет | Количество случаев, когда запрос не использовал индексы. |
sum_no_good_index_used |
bigint(20) | Нет | Количество случаев, когда подсистема выполнения запросов не использовала правильные индексы. |
sum_created_tmp_tables |
bigint(20) | Нет | Общее число созданных временных таблиц. |
sum_created_tmp_disk_tables |
bigint(20) | Нет | Общее число временных таблиц, созданных на диске (с помощью операций ввода-вывода). |
first_seen |
TIMESTAMP | Нет | Первое обнаружение (в формате UTC) запроса во время периода агрегирования. |
last_seen |
TIMESTAMP | Нет | Последнее обнаружение (в формате UTC) запроса во время этого периода агрегирования. |
mysql.query_store_wait_stats
Это представление возвращает данные событий ожидания в хранилище запросов. Для каждого отдельного идентификатора базы данных, идентификатора пользователя, идентификатора запроса и события используется отдельная строка.
Имя | Тип данных | IS_NULLABLE | Description |
---|---|---|---|
interval_start |
TIMESTAMP | Нет | Начало интервала (с приращением по 15 минут). |
interval_end |
TIMESTAMP | Нет | Окончание интервала (с приращением по 15 минут). |
query_id |
bigint(20) | Нет | Созданный уникальный идентификатор нормализованного запроса (из хранилища запросов). |
query_digest_id |
varchar(32) | Нет | Нормализованный текст запроса после удаления всех литералов (из хранилища запросов). |
query_digest_text |
longtext | Нет | Первое вхождение фактического запроса с литералами (из хранилища запросов). |
event_type |
varchar(32) | Нет | Категория события ожидания. |
event_name |
varchar(128) | Нет | Имя события ожидания. |
count_star |
bigint(20) | Нет | Число событий ожидания, выбранных в течение интервала для запроса. |
sum_timer_wait_ms |
двойной точности | Нет | Общее время ожидания (в миллисекундах) этого запроса в течение интервала. |
Функции
Имя | Description |
---|---|
mysql.az_purge_querystore_data(TIMESTAMP) |
Очистка всех данных хранилища запросов до заданной метки времени. |
mysql.az_procedure_purge_querystore_event(TIMESTAMP) |
Очистка всех данных событий ожидания до заданной метки времени. |
mysql.az_procedure_purge_recommendation(TIMESTAMP) |
Очистка рекомендаций, срок действия которых предшествует заданной метке времени. |
Известные проблемы и ограничения
- Если для сервера MySQL включен параметр
read_only
, то хранилище запросов не сможет записывать данные. - Операции хранилища запросов могут быть прерваны при обнаружении длинных запросов в Юникоде (>= 6000 байт).
- Период хранения статистики ожидания составляет 24 часа.
- Для получения статистики ожидания используется выборка части событий. Частоту выборки можно изменить с помощью параметра
query_store_wait_sampling_frequency
.
Следующие шаги
- Узнайте больше об анализе производительности запросов.