17.15.3 InnoDB INFORMATION_SCHEMA Схемы Объектов Таблиц
Вы можете извлечь метаданные о схемах объектов, управляемых InnoDB, используя InnoDB INFORMATION_SCHEMA таблицы. Эта информация поступает из словаря данных. Традиционно, вы бы получали эту информацию, используя методы из Раздела 17.17, «InnoDB Мониторы», настраивая InnoDB мониторы и анализируя вывод из оператора SHOW ENGINE INNODB
STATUS. Интерфейс таблиц InnoDB INFORMATION_SCHEMA позволяет вам запросить эти данные с помощью SQL.
InnoDB INFORMATION_SCHEMA таблицы схемы объектов включают таблицы, перечисленные здесь:
INNODB_DATAFILESINNODB_TABLESTATSINNODB_FOREIGNINNODB_COLUMNSINNODB_INDEXESINNODB_FIELDSINNODB_TABLESPACESINNODB_TABLESPACES_BRIEFINNODB_FOREIGN_COLSINNODB_TABLES
Имена таблиц указывают на тип предоставляемых данных:
INNODB_TABLESпредоставляет метаданные оInnoDBтаблицах.INNODB_COLUMNSпредоставляет метаданные оInnoDBстолбцах таблиц.INNODB_INDEXESпредоставляет метаданные оInnoDBиндексах.INNODB_FIELDSпредоставляет метаданные о столбцах ключей (полях)InnoDBиндексов.INNODB_TABLESTATSпредоставляет представление о низкоуровневой статусной информации оInnoDBтаблицах, полученной из структур данных в памяти.INNODB_DATAFILESпредоставляет информацию о пути к файлам дляInnoDBтаблиц с файлами на запись и общих табличных пространствах.INNODB_TABLESPACESпредоставляет метаданные оInnoDBфайлах на запись, общих и откатных табличных пространствах.INNODB_TABLESPACES_BRIEFпредоставляет подмножество метаданных оInnoDBтабличных пространствах.INNODB_FOREIGNпредоставляет метаданные о внешних ключах, определенных вInnoDBтаблицах.INNODB_FOREIGN_COLSпредоставляет метаданные о столбцах внешних ключей, определенных вInnoDBтаблицах.
InnoDB INFORMATION_SCHEMA таблицы схемы объектов могут быть объединены через поля, такие как TABLE_ID, INDEX_ID и SPACE, что позволяет легко извлекать все доступные данные для объекта, который вы хотите изучить или отслеживать.
Обратитесь к документации InnoDB INFORMATION_SCHEMA для получения информации о столбцах каждой таблицы.
Пример 17.2 Таблицы объектов схемы INFORMATION_SCHEMA InnoDB
В этом примере используется простая таблица (t1) с одним индексом (i1), чтобы продемонстрировать тип метаданных, содержащихся в таблицах объектов схемы InnoDB INFORMATION_SCHEMA.
-
Создайте тестовую базу данных и таблицу
t1:mysql>
CREATE DATABASE test;mysql>USE test;mysql>CREATE TABLE t1 (col1 INT,col2 CHAR(10),col3 VARCHAR(10))ENGINE = InnoDB;mysql>CREATE INDEX i1 ON t1(col1); -
После создания таблицы
t1, запроситеINNODB_TABLES, чтобы найти метаданные дляtest/t1:mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G*************************** 1. row *************************** TABLE_ID: 71 NAME: test/t1 FLAG: 1 N_COLS: 6 SPACE: 57 ROW_FORMAT: Compact ZIP_PAGE_SIZE: 0 INSTANT_COLS: 0Таблица
t1имеет размерTABLE_ID71. ПолеFLAGпредоставляет информацию на уровне битов о формате и характеристиках хранения таблицы. Существует шесть столбцов, три из которых являются скрытыми столбцами, созданнымиInnoDB(DB_ROW_ID,DB_TRX_IDиDB_ROLL_PTR). Идентификатор табличногоSPACEсоставляет 57 (значение 0 указывает, что таблица находится в системном табличном пространстве).ROW_FORMATимеет формат Compact.ZIP_PAGE_SIZEприменяется только к таблицам сCompressedформатом строк.INSTANT_COLSпоказывает количество столбцов в таблице до добавления первого мгновенного столбца с использованиемALTER TABLE ... ADD COLUMNсALGORITHM=INSTANT. -
Используя информацию из
INNODB_TABLES, запросите таблицуINNODB_COLUMNSдля получения информации о столбцах таблицы.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS where TABLE_ID = 71\G*************************** 1. row *************************** TABLE_ID: 71 NAME: col1 POS: 0 MTYPE: 6 PRTYPE: 1027 LEN: 4 HAS_DEFAULT: 0 DEFAULT_VALUE: NULL *************************** 2. row *************************** TABLE_ID: 71 NAME: col2 POS: 1 MTYPE: 2 PRTYPE: 524542 LEN: 10 HAS_DEFAULT: 0 DEFAULT_VALUE: NULL *************************** 3. row *************************** TABLE_ID: 71 NAME: col3 POS: 2 MTYPE: 1 PRTYPE: 524303 LEN: 10 HAS_DEFAULT: 0 DEFAULT_VALUE: NULLВ дополнение к
TABLE_IDи столбцуNAME,INNODB_COLUMNSпредоставляет порядковый номер (POS) каждого столбца (начиная с 0 и увеличивая последовательно), тип столбца или “основной тип” (6 = INT, 2 = CHAR, 1 = VARCHAR),PRTYPEили “точный тип” (двоичное значение с битами, представляющими тип данных MySQL, код набора символов и возможность наличия NULL), и длину столбца (LEN). СтолбцыHAS_DEFAULTиDEFAULT_VALUEприменяются только к столбцам, добавленным мгновенно с помощьюALTER TABLE ... ADD COLUMNсALGORITHM=INSTANT. -
Используя информацию из
INNODB_TABLES, снова запроситеINNODB_INDEXESдля получения информации об индексах, связанных с таблицейt1.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_INDEXES WHERE TABLE_ID = 71 \G*************************** 1. row *************************** INDEX_ID: 111 NAME: GEN_CLUST_INDEX TABLE_ID: 71 TYPE: 1 N_FIELDS: 0 PAGE_NO: 3 SPACE: 57 MERGE_THRESHOLD: 50 *************************** 2. row *************************** INDEX_ID: 112 NAME: i1 TABLE_ID: 71 TYPE: 0 N_FIELDS: 1 PAGE_NO: 4 SPACE: 57 MERGE_THRESHOLD: 50INNODB_INDEXESвозвращает данные для двух индексов. Первый индекс —GEN_CLUST_INDEX, который является кластеризованным индексом, созданнымInnoDB, если у таблицы нет пользовательского кластеризованного индекса. Второй индекс (i1) — это пользовательский вторичный индекс.INDEX_ID— идентификатор индекса, уникальный для всех баз данных в экземпляре.TABLE_IDидентифицирует таблицу, с которой связан индекс. Значение индексаTYPEуказывает тип индекса (1 = Кластеризованный индекс, 0 = Вторичный индекс). ЗначениеN_FILEDS— количество полей, составляющих индекс.PAGE_NO— номер корневой страницы индексного B-дерева, аSPACE— идентификатор табличного пространства, где находится индекс. Значение, отличное от нуля, указывает, что индекс не находится в системном табличном пространстве.MERGE_THRESHOLDопределяет процентный пороговый уровень для количества данных в странице индекса. Если количество данных в странице индекса опускается ниже этого значения (по умолчанию 50%) при удалении строки или укорочении строки операцией обновления,InnoDBпытается объединить страницу индекса с соседней страницей индекса. -
Используя информацию из
INNODB_INDEXES, запроситеINNODB_FIELDSдля получения информации о полях индексаi1.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_FIELDS where INDEX_ID = 112 \G*************************** 1. row *************************** INDEX_ID: 112 NAME: col1 POS: 0INNODB_FIELDSпредоставляетNAMEиндексированного поля и его порядковый номер в индексе. Если индекс (i1) был определен по нескольким полям,INNODB_FIELDSбы предоставляла метаданные для каждого индексированного поля. -
Используя информацию из
INNODB_TABLES, запросите таблицуINNODB_TABLESPACESдля получения информации о табличном пространстве таблицы.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE = 57 \G*************************** 1. row *************************** SPACE: 57 NAME: test/t1 FLAG: 16417 ROW_FORMAT: Dynamic PAGE_SIZE: 16384 ZIP_PAGE_SIZE: 0 SPACE_TYPE: Single FS_BLOCK_SIZE: 4096 FILE_SIZE: 114688 ALLOCATED_SIZE: 98304 AUTOEXTEND_SIZE: 0 SERVER_VERSION: 8.4.0 SPACE_VERSION: 1 ENCRYPTION: N STATE: normalВ дополнение к
SPACEидентификатору табличного пространства иNAMEсвязанной таблицы,INNODB_TABLESPACESпредоставляет данные о табличном пространствеFLAG, которые представляют собой информацию на уровне битов о формате и характеристиках хранения табличного пространства. Также предоставляются данные табличного пространстваROW_FORMAT,PAGE_SIZEи несколько других элементов метаданных табличного пространства. -
Используя информацию из
INNODB_TABLES, снова запроситеINNODB_DATAFILESдля получения расположения файла данных табличного пространства.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_DATAFILES WHERE SPACE = 57 \G*************************** 1. row *************************** SPACE: 57 PATH: ./test/t1.ibdФайл данных расположен в каталоге
testв каталогеdataMySQL. Если табличное пространство было создано в расположении вне каталога данных MySQL с помощьюDATA DIRECTORYвCREATE TABLEоператоре, табличное пространствоPATHбудет полным путем к каталогу. -
В качестве заключительного шага добавьте строку в таблицу
t1(TABLE_ID = 71) и просмотрите данные в таблицеINNODB_TABLESTATS. Данные в этой таблице используются оптимизатором MySQL для расчета, какой индекс использовать при запросе кInnoDBтаблице. Эта информация получена из структур данных в оперативной памяти.mysql>
INSERT INTO t1 VALUES(5, 'abc', 'def');Query OK, 1 row affected (0.06 sec) mysql>SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESTATS where TABLE_ID = 71 \G*************************** 1. row *************************** TABLE_ID: 71 NAME: test/t1 STATS_INITIALIZED: Initialized NUM_ROWS: 1 CLUST_INDEX_SIZE: 1 OTHER_INDEX_SIZE: 0 MODIFIED_COUNTER: 1 AUTOINC: 0 REF_COUNT: 1Поле
STATS_INITIALIZEDуказывает, собраны ли статистические данные для таблицы.NUM_ROWS— текущая оценочное число строк в таблице. ПоляCLUST_INDEX_SIZEиOTHER_INDEX_SIZEотображают количество страниц на диске, хранящих кластеризованные и вторичные индексы для таблицы соответственно. ЗначениеMODIFIED_COUNTERпоказывает количество строк, измененных операциями DML и каскадными операциями от внешних ключей. ЗначениеAUTOINC— следующее число, которое будет выдано для любой операции на основе автоинкремента. В таблицеt1нет определенных столбцов автоинкремента, поэтому значение равно 0. ЗначениеREF_COUNT— счетчик. Когда счетчик достигает 0, это означает, что метаданные таблицы могут быть удалены из кэша таблиц.
END_OF_DOCUMENT_MARKER
Пример 17.3 Таблицы схем объектов FOREIGN KEY INFORMATION_SCHEMA
Таблицы INNODB_FOREIGN и INNODB_FOREIGN_COLS предоставляют данные о внешних ключах. В данном примере используется родительская таблица и дочерняя таблица с внешним ключом, чтобы продемонстрировать данные, найденные в таблицах INNODB_FOREIGN и INNODB_FOREIGN_COLS.
-
Создайте тестовую базу данных с родительской и дочерней таблицами:
mysql>
CREATE DATABASE test;mysql>USE test;mysql>CREATE TABLE parent (id INT NOT NULL,PRIMARY KEY (id)) ENGINE=INNODB;mysql>CREATE TABLE child (id INT, parent_id INT,->INDEX par_ind (parent_id),->CONSTRAINT fk1->FOREIGN KEY (parent_id) REFERENCES parent(id)->ON DELETE CASCADE) ENGINE=INNODB; -
После создания родительской и дочерней таблиц выполните запрос к
INNODB_FOREIGNи найдите данные внешнего ключа для отношения внешнего ключаtest/childиtest/parent:mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN \G*************************** 1. row *************************** ID: test/fk1 FOR_NAME: test/child REF_NAME: test/parent N_COLS: 1 TYPE: 1Метаданные включают внешний ключ
ID(fk1), который назван в честьCONSTRAINT, который был определён в дочерней таблице.FOR_NAME— имя дочерней таблицы, где определён внешний ключ.REF_NAME— имя родительской таблицы (таблицы “ссылка”).N_COLS— количество столбцов в индексе внешнего ключа.TYPE— числовое значение, представляющее флаги битов, которые предоставляют дополнительную информацию о столбце внешнего ключа. В данном случае значениеTYPEравно 1, что указывает на то, что опцияON DELETE CASCADEбыла указана для внешнего ключа. Обратитесь к определению таблицыINNODB_FOREIGNдля получения дополнительной информации о значенияхTYPE. -
Используя внешний ключ
ID, выполните запрос кINNODB_FOREIGN_COLS, чтобы просмотреть данные о столбцах внешнего ключа.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN_COLS WHERE ID = 'test/fk1' \G*************************** 1. row *************************** ID: test/fk1 FOR_COL_NAME: parent_id REF_COL_NAME: id POS: 0FOR_COL_NAME— имя столбца внешнего ключа в дочерней таблице, аREF_COL_NAME— имя столбца ссылки в родительской таблице. ЗначениеPOS— порядковый номер поля ключа в индексе внешнего ключа, начиная с нуля.
Пример 17.4 Объединение таблиц схем объектов InnoDB INFORMATION_SCHEMA
В данном примере показано объединение трёх таблиц схемы объектов INFORMATION_SCHEMA (INNODB_TABLES, INNODB_TABLESPACES и INNODB_TABLESTATS), чтобы собрать информацию о формате файла, формате строк, размере страницы и размере индекса для таблиц в образце базы данных employees.
Используются следующие псевдонимы таблиц для сокращения строки запроса:
Функция управления потоком IF() используется для учёта сжатых таблиц. Если таблица сжата, размер индекса рассчитывается с использованием ZIP_PAGE_SIZE вместо PAGE_SIZE. CLUST_INDEX_SIZE и OTHER_INDEX_SIZE, которые представлены в байтах, делятся на 1024*1024, чтобы получить размеры индексов в мегабайтах (МБ). Значения МБ округляются до нуля десятичных знаков с использованием функции ROUND().
mysql> SELECT a.NAME, a.ROW_FORMAT,
@page_size :=
IF(a.ROW_FORMAT='Compressed',
b.ZIP_PAGE_SIZE, b.PAGE_SIZE)
AS page_size,
ROUND((@page_size * c.CLUST_INDEX_SIZE)
/(1024*1024)) AS pk_mb,
ROUND((@page_size * c.OTHER_INDEX_SIZE)
/(1024*1024)) AS secidx_mb
FROM INFORMATION_SCHEMA.INNODB_TABLES a
INNER JOIN INFORMATION_SCHEMA.INNODB_TABLESPACES b on a.NAME = b.NAME
INNER JOIN INFORMATION_SCHEMA.INNODB_TABLESTATS c on b.NAME = c.NAME
WHERE a.NAME LIKE 'employees/%'
ORDER BY a.NAME DESC;
+------------------------+------------+-----------+-------+-----------+
| NAME | ROW_FORMAT | page_size | pk_mb | secidx_mb |
+------------------------+------------+-----------+-------+-----------+
| employees/titles | Dynamic | 16384 | 20 | 11 |
| employees/salaries | Dynamic | 16384 | 93 | 34 |
| employees/employees | Dynamic | 16384 | 15 | 0 |
| employees/dept_manager | Dynamic | 16384 | 0 | 0 |
| employees/dept_emp | Dynamic | 16384 | 12 | 10 |
| employees/departments | Dynamic | 16384 | 0 | 0 |
+------------------------+------------+-----------+-------+-----------+
© 2025 Oracle
Licensed under the GPLv2 License.