Мониторинг производительности Базы данных Azure для MySQL с помощью хранилища запросов

ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для MySQL — отдельный сервер

Важно!

База данных Azure для MySQL один сервер находится на пути выхода на пенсию. Настоятельно рекомендуется выполнить обновление до База данных Azure для MySQL гибкого сервера. Дополнительные сведения о миграции на гибкий сервер База данных Azure для MySQL см. в статье "Что происходит с одним сервером База данных Azure для MySQL?"

Область применения: База данных Azure для MySQL 5.7, 8.0

Компонент "Хранилище запросов" в Базе данных Azure для MySQL позволяет отслеживать производительность запросов с течением времени. Хранилище запросов упрощает устранение неполадок, позволяя быстро выявлять самые медленные и ресурсоемкие запросы. Хранилище запросов автоматически ведет журнал запросов и статистики выполнения и сохраняет их для просмотра. Этот компонент разделяет данные по периодам, давая представление о закономерностях использования баз данных. Данные для всех пользователей, баз данных и запросов хранятся в базе данных схемы mysql в экземпляре Базы данных Azure для MySQL.

Распространенные сценарии использования хранилища запросов

Хранилище запросов можно использовать во многих сценариях, включая следующие:

  • обнаружение регрессивных запросов;
  • определение числа выполнений запроса за данный период времени;
  • сравнение среднего времени выполнения запроса за периоды времени для выявления больших расхождений;

Включение хранилища запросов

Хранилище запросов является дополнительной функцией, поэтому оно не активно на сервере по умолчанию. Хранилище запросов включается или отключается глобально для всех (но не для отдельных) баз данных на данном сервере.

Включение хранилища запросов с помощью портала Azure

  1. Войдите на портал Azure и выберите сервер Базы данных Azure для MySQL.
  2. В разделе меню Параметры выберите Параметры сервера.
  3. Найдите параметр query_store_capture_mode.
  4. Задайте для него значение "ALL" и щелкните Сохранить.

Чтобы включить статистику ожидания в хранилище запросов, сделайте следующее.

  1. Найдите параметр query_store_wait_sampling_capture_mode.
  2. Задайте для него значение "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.

Следующие шаги