10.2.4 Оптимизация запросов Performance Schema
Приложения, которые отслеживают работу баз данных, могут часто использовать таблицы Performance Schema. Чтобы писать запросы к этим таблицам наиболее эффективно, используйте их индексы. Например, включите в запрос условие, которое ограничивает извлекаемые строки, основываясь на сравнении со значениями в индексированном столбце.
Большинство таблиц Performance Schema имеют индексы. Таблицы, которые не имеют индексов, обычно содержат мало строк или вряд ли будут часто запрашиваться. Индексы Performance Schema дают оптимизатору доступ к планам выполнения, отличным от полного сканирования таблицы. Эти индексы также повышают производительность для связанных объектов, таких как представления схемы sys, которые используют эти таблицы.
Чтобы узнать, есть ли у заданной таблицы Performance Schema индексы и каковы они, используйте SHOW INDEX или SHOW CREATE TABLE:
mysql> SHOW INDEX FROM performance_schema.accounts\G
*************************** 1. row ***************************
Table: accounts
Non_unique: 0
Key_name: ACCOUNT
Seq_in_index: 1
Column_name: USER
Collation: NULL
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: HASH
Comment:
Index_comment:
Visible: YES
*************************** 2. row ***************************
Table: accounts
Non_unique: 0
Key_name: ACCOUNT
Seq_in_index: 2
Column_name: HOST
Collation: NULL
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: HASH
Comment:
Index_comment:
Visible: YES
mysql> SHOW CREATE TABLE performance_schema.rwlock_instances\G
*************************** 1. row ***************************
Table: rwlock_instances
Create Table: CREATE TABLE `rwlock_instances` (
`NAME` varchar(128) NOT NULL,
`OBJECT_INSTANCE_BEGIN` bigint(20) unsigned NOT NULL,
`WRITE_LOCKED_BY_THREAD_ID` bigint(20) unsigned DEFAULT NULL,
`READ_LOCKED_BY_COUNT` int(10) unsigned NOT NULL,
PRIMARY KEY (`OBJECT_INSTANCE_BEGIN`),
KEY `NAME` (`NAME`),
KEY `WRITE_LOCKED_BY_THREAD_ID` (`WRITE_LOCKED_BY_THREAD_ID`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Чтобы увидеть план выполнения запроса Performance Schema и узнать, использует ли он какие-либо индексы, используйте EXPLAIN:
mysql> EXPLAIN SELECT * FROM performance_schema.accounts
WHERE (USER,HOST) = ('root','localhost')\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: accounts
partitions: NULL
type: const
possible_keys: ACCOUNT
key: ACCOUNT
key_len: 278
ref: const,const
rows: 1
filtered: 100.00
Extra: NULL
Вывод EXPLAIN показывает, что оптимизатор использует индекс таблицы accounts ACCOUNT, который состоит из столбцов USER и HOST.
Индексы Performance Schema являются виртуальными: они являются конструкцией движка хранения Performance Schema и не используют память или дисковое пространство. Performance Schema передает информацию об индексе оптимизатору, чтобы тот мог строить эффективные планы выполнения. В свою очередь, Performance Schema использует информацию оптимизатора о том, что искать (например, определенное значение ключа), чтобы выполнять эффективные запросы без создания фактических структур индексов. Эта реализация предоставляет две важные выгоды:
Она полностью избегает затрат на обслуживание, обычно возникающих для таблиц, которые часто обновляются.
Она на ранней стадии выполнения запроса уменьшает количество извлекаемых данных. Для условий по индексированным столбцам Performance Schema эффективно возвращает только строки таблицы, которые удовлетворяют условиям запроса. Без индекса Performance Schema вернул бы все строки в таблице, потребовав от оптимизатора позже оценить условия для каждой строки, чтобы получить окончательный результат.
Индексы Performance Schema предопределены и не могут быть удалены, добавлены или изменены.
Индексы Performance Schema похожи на хеш-индексы. Например:
Они используются только для сравнений по равенству, которые используют операторы
=или<=>.Они неупорядочены. Если результат запроса должен иметь определенные характеристики упорядочения строк, включите условие
ORDER BY.
Дополнительную информацию о хеш-индексах см. в Разделе 10.3.9, «Сравнение индексов B-дерева и хеш-индексов».
© 2025 Oracle
Licensed under the GPLv2 License.