14.16.3 Системные таблицы InnoDB INFORMATION_SCHEMA
Вы можете извлечь метаданные об объектах схемы, управляемых InnoDB, используя таблицы InnoDB INFORMATION_SCHEMA. Эта информация взята из внутренних системных таблиц InnoDB (также называемых словарем данных InnoDB), к которым нельзя напрямую обращаться, как к обычным таблицам InnoDB. Традиционно, такую информацию можно получить, используя методы из раздела 14.18, «InnoDB Мониторы», настроив мониторы InnoDB и обработав вывод из заявления SHOW ENGINE INNODB
STATUS. Интерфейс таблиц InnoDB INFORMATION_SCHEMA позволяет запросить эти данные с помощью SQL.
За исключением INNODB_SYS_TABLESTATS, для которого нет соответствующей внутренней системной таблицы, таблицы InnoDB INFORMATION_SCHEMA заполняются данными, считанными непосредственно из внутренних системных таблиц InnoDB, а не из кешированных метаданных в памяти.
Системные таблицы InnoDB INFORMATION_SCHEMA включают в себя таблицы, перечисленные ниже.
mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_SYS%';
+--------------------------------------------+
| Tables_in_information_schema (INNODB_SYS%) |
+--------------------------------------------+
| INNODB_SYS_DATAFILES |
| INNODB_SYS_TABLESTATS |
| INNODB_SYS_FOREIGN |
| INNODB_SYS_COLUMNS |
| INNODB_SYS_INDEXES |
| INNODB_SYS_FIELDS |
| INNODB_SYS_TABLESPACES |
| INNODB_SYS_FOREIGN_COLS |
| INNODB_SYS_TABLES |
+--------------------------------------------+
Имена таблиц указывают на тип предоставляемых данных:
INNODB_SYS_TABLESпредоставляет метаданные о таблицахInnoDB, эквивалентные информации в таблицеSYS_TABLESв словаре данныхInnoDB.INNODB_SYS_COLUMNSпредоставляет метаданные о столбцах таблицInnoDB, эквивалентные информации в таблицеSYS_COLUMNSв словаре данныхInnoDB.INNODB_SYS_INDEXESпредоставляет метаданные об индексахInnoDB, эквивалентные информации в таблицеSYS_INDEXESв словаре данныхInnoDB.INNODB_SYS_FIELDSпредоставляет метаданные о ключевых столбцах (полях) индексовInnoDB, эквивалентные информации в таблицеSYS_FIELDSв словаре данныхInnoDB.INNODB_SYS_TABLESTATSпредоставляет представление информации о низкоуровневом состоянии таблицInnoDB, полученное из структур данных в памяти. Соответствующей внутренней системной таблицыInnoDBнет.INNODB_SYS_DATAFILESпредоставляет информацию о путях к файлам данных для таблиц с файлом на таблицу и общих табличных пространств, эквивалентную информации в таблицеSYS_DATAFILESв словаре данныхInnoDB.INNODB_SYS_TABLESPACESпредоставляет метаданные о табличных пространствах с файлом на таблицу и общих табличных пространствах, эквивалентные информации в таблицеSYS_TABLESPACESв словаре данныхInnoDB.INNODB_SYS_FOREIGNпредоставляет метаданные о внешних ключах, определенных в таблицахInnoDB, эквивалентные информации в таблицеSYS_FOREIGNв словаре данныхInnoDB.INNODB_SYS_FOREIGN_COLSпредоставляет метаданные о столбцах внешних ключей, которые определены в таблицахInnoDB, эквивалентные информации в таблицеSYS_FOREIGN_COLSв словаре данныхInnoDB.
Системные таблицы InnoDB INFORMATION_SCHEMA могут быть объединены через поля, такие как TABLE_ID, INDEX_ID и SPACE, что позволяет легко получить все доступные данные для объекта, который вы хотите изучить или отслеживать.
Обратитесь к документации по InnoDB INFORMATION_SCHEMA за информацией о столбцах каждой таблицы.
Пример 14.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_SYS_TABLES, чтобы найти метаданные дляtest/t1:mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='test/t1' \G*************************** 1. row *************************** TABLE_ID: 71 NAME: test/t1 FLAG: 1 N_COLS: 6 SPACE: 57 FILE_FORMAT: Antelope ROW_FORMAT: Compact ZIP_PAGE_SIZE: 0 ...Таблица
t1имеет размерTABLE_ID71. ПолеFLAGпредоставляет информацию на уровне битов о формате и характеристиках хранения таблицы. Существует шесть столбцов, три из которых являются скрытыми столбцами, созданнымиInnoDB(DB_ROW_ID,DB_TRX_IDиDB_ROLL_PTR). Идентификатор табличногоSPACEсоставляет 57 (значение 0 указывает, что таблица находится в системном табличном пространстве).FILE_FORMAT— Antelope, аROW_FORMAT— Compact.ZIP_PAGE_SIZEотносится только к таблицам с форматом строкCompressed. -
Используя информацию из
TABLE_IDизINNODB_SYS_TABLES, запросите таблицуINNODB_SYS_COLUMNSдля получения информации о столбцах таблицы.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS where TABLE_ID = 71 \G*************************** 1. row *************************** TABLE_ID: 71 NAME: col1 POS: 0 MTYPE: 6 PRTYPE: 1027 LEN: 4 *************************** 2. row *************************** TABLE_ID: 71 NAME: col2 POS: 1 MTYPE: 2 PRTYPE: 524542 LEN: 10 *************************** 3. row *************************** TABLE_ID: 71 NAME: col3 POS: 2 MTYPE: 1 PRTYPE: 524303 LEN: 10В дополнение к
TABLE_IDи столбцуNAME,INNODB_SYS_COLUMNSпредоставляет порядковый номер (POS) каждого столбца (начиная с 0 и увеличиваясь последовательно), столбецMTYPEили “основной тип” (6 = INT, 2 = CHAR, 1 = VARCHAR),PRTYPEили “точный тип” (двоичное значение с битами, которые представляют тип данных MySQL, код набора символов и возможность наличия NULL), и длину столбца (LEN). -
Используя информацию из
TABLE_IDизINNODB_SYS_TABLES, запроситеINNODB_SYS_INDEXESдля получения информации об индексах, связанных с таблицейt1.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_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_SYS_INDEXESвозвращает данные для двух индексов. Первый индекс —GEN_CLUST_INDEX, который является кластеризованным индексом, созданнымInnoDB, если у таблицы нет определенного пользователем кластеризованного индекса. Второй индекс (i1) — это определенный пользователем вторичный индекс.INDEX_ID— идентификатор индекса, уникальный для всех баз данных в экземпляре.TABLE_IDидентифицирует таблицу, с которой связан индекс. Значение индексаTYPEуказывает на тип индекса (1 = кластеризованный индекс, 0 = вторичный индекс). ЗначениеN_FILEDS— количество полей, составляющих индекс.PAGE_NO— номер корневой страницы индексного B-дерева, аSPACE— идентификатор табличного пространства, в котором находится индекс. ненулевое значение указывает, что индекс не находится в системном табличном пространстве.MERGE_THRESHOLDопределяет пороговое значение процента для количества данных на странице индекса. Если количество данных на странице индекса падает ниже этого значения (по умолчанию 50%), когда строка удаляется или укорачивается операцией обновления,InnoDBпытается объединить страницу индекса с соседней страницей индекса. -
Используя информацию из
INDEX_IDизINNODB_SYS_INDEXES, запроситеINNODB_SYS_FIELDSдля получения информации о полях индексаi1.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS where INDEX_ID = 112 \G*************************** 1. row *************************** INDEX_ID: 112 NAME: col1 POS: 0INNODB_SYS_FIELDSпредоставляетNAMEиндексированного поля и его порядковый номер в индексе. Если индекс (i1) был определен по нескольким полям,INNODB_SYS_FIELDSпредоставит метаданные для каждого из индексированных полей. -
Используя информацию из
SPACEизINNODB_SYS_TABLES, запросите таблицуINNODB_SYS_TABLESPACESдля получения информации о табличном пространстве таблицы.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE SPACE = 57 \G*************************** 1. row *************************** SPACE: 57 NAME: test/t1 FLAG: 0 FILE_FORMAT: Antelope ROW_FORMAT: Compact or Redundant PAGE_SIZE: 16384 ZIP_PAGE_SIZE: 0В дополнение к
SPACEидентификатору табличного пространства иNAMEсвязанной таблицы,INNODB_SYS_TABLESPACESпредоставляет данные табличного пространстваFLAG, которые представляют собой информацию на уровне битов о формате и характеристиках хранения табличного пространства. Также представлены данные табличного пространстваFILE_FORMAT,ROW_FORMAT,PAGE_SIZEи несколько других элементов метаданных табличного пространства. -
Используя информацию из
SPACEизINNODB_SYS_TABLES, запроситеINNODB_SYS_DATAFILESдля определения местоположения файла данных табличного пространства.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_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_SYS_TABLESTATS. Данные в этой таблице используются оптимизатором MySQL для расчета, какой индекс использовать при запросе таблицыInnoDB. Эта информация получена из структур данных в оперативной памяти. Нет соответствующей внутренней таблицы системыInnoDB.mysql>
INSERT INTO t1 VALUES(5, 'abc', 'def');Query OK, 1 row affected (0.06 sec) mysql>SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_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
Пример 14.3 Внешние ключи таблиц системы INFORMATION_SCHEMA
Таблицы INNODB_SYS_FOREIGN и INNODB_SYS_FOREIGN_COLS предоставляют данные об отношениях внешних ключей. В этом примере используются родительская и дочерняя таблицы с отношением внешнего ключа для демонстрации данных, содержащихся в таблицах INNODB_SYS_FOREIGN и INNODB_SYS_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 fk1FOREIGN KEY (parent_id) REFERENCES parent(id)ON DELETE CASCADE) ENGINE=INNODB; -
После создания родительской и дочерней таблиц выполните запрос к
INNODB_SYS_FOREIGNи найдите данные внешнего ключа для отношения внешнего ключа междуtest/childиtest/parent:mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_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_SYS_FOREIGNдля получения дополнительной информации о значенияхTYPE. -
Используя внешний ключ
ID, выполните запрос кINNODB_SYS_FOREIGN_COLS, чтобы просмотреть данные о столбцах внешнего ключа.mysql>
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_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— порядковый номер поля ключа в индексе внешнего ключа, начиная с нуля.
Пример 14.4 Объединение таблиц системы InnoDB INFORMATION_SCHEMA
В этом примере показано объединение трех таблиц системы INFORMATION_SCHEMA (INNODB_SYS_TABLES, INNODB_SYS_TABLESPACES и INNODB_SYS_TABLESTATS) для получения информации о формате файлов, формате строк, размере страниц и размере индекса таблиц в базе данных примеров employees.
Ниже приведены псевдонимы имен таблиц для сокращения строки запроса:
Функция управления потоком IF() используется для учета сжатых таблиц. Если таблица сжата, размер индекса рассчитывается с использованием ZIP_PAGE_SIZE вместо PAGE_SIZE. CLUST_INDEX_SIZE и OTHER_INDEX_SIZE, которые указаны в байтах, делятся на 1024*1024, чтобы получить размеры индексов в мегабайтах (МБ). Значения МБ округляются до нуля десятичных знаков с помощью функции ROUND().
mysql> SELECT a.NAME, a.FILE_FORMAT, 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_SYS_TABLES a
INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES b on a.NAME = b.NAME
INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS c on b.NAME = c.NAME
WHERE a.NAME LIKE 'employees/%'
ORDER BY a.NAME DESC;
+------------------------+-------------+------------+-----------+-------+-----------+
| NAME | FILE_FORMAT | ROW_FORMAT | page_size | pk_mb | secidx_mb |
+------------------------+-------------+------------+-----------+-------+-----------+
| employees/titles | Antelope | Compact | 16384 | 20 | 11 |
| employees/salaries | Antelope | Compact | 16384 | 91 | 33 |
| employees/employees | Antelope | Compact | 16384 | 15 | 0 |
| employees/dept_manager | Antelope | Compact | 16384 | 0 | 0 |
| employees/dept_emp | Antelope | Compact | 16384 | 12 | 10 |
| employees/departments | Antelope | Compact | 16384 | 0 | 0 |
+------------------------+-------------+------------+-----------+-------+-----------+
© 2025 Oracle
Licensed under the GPLv2 License.