10.2.4 Оптимизация запросов Performance Schema
Приложения, которые отслеживают работу баз данных, могут часто использовать таблицы Performance Schema. Для написания эффективных запросов к этим таблицам следует использовать их индексы. Например, включите условие `WHERE` (WHERE), которое ограничивает извлечённые строки сравнением со специфическими значениями в индексированном столбце.
Большинство таблиц 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, который состоит из столбцов 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.