Spec-Zone.ru › MySQL 5.7

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 за информацией о столбцах каждой таблицы.

END_OF_DOCUMENT_MARKER

Пример 14.2 Системные таблицы INFORMATION_SCHEMA InnoDB

В данном примере используется простая таблица (t1) с одним индексом (i1) для демонстрации типа метаданных, содержащихся в таблицах системы InnoDB INFORMATION_SCHEMA.

  1. Создайте тестовую базу данных и таблицу 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);
    
  2. После создания таблицы 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_ID 71. Поле FLAG предоставляет информацию на уровне битов о формате и характеристиках хранения таблицы. Существует шесть столбцов, три из которых являются скрытыми столбцами, созданными InnoDB (DB_ROW_ID, DB_TRX_ID и DB_ROLL_PTR). Идентификатор табличного SPACE составляет 57 (значение 0 указывает, что таблица находится в системном табличном пространстве). FILE_FORMAT — Antelope, а ROW_FORMAT — Compact. ZIP_PAGE_SIZE относится только к таблицам с форматом строк Compressed.

  3. Используя информацию из 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).

  4. Используя информацию из 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: 50
    

    INNODB_SYS_INDEXES возвращает данные для двух индексов. Первый индекс — GEN_CLUST_INDEX, который является кластеризованным индексом, созданным InnoDB, если у таблицы нет определенного пользователем кластеризованного индекса. Второй индекс (i1) — это определенный пользователем вторичный индекс.

    INDEX_ID — идентификатор индекса, уникальный для всех баз данных в экземпляре. TABLE_ID идентифицирует таблицу, с которой связан индекс. Значение индекса TYPE указывает на тип индекса (1 = кластеризованный индекс, 0 = вторичный индекс). Значение N_FILEDS — количество полей, составляющих индекс. PAGE_NO — номер корневой страницы индексного B-дерева, а SPACE — идентификатор табличного пространства, в котором находится индекс. ненулевое значение указывает, что индекс не находится в системном табличном пространстве. MERGE_THRESHOLD определяет пороговое значение процента для количества данных на странице индекса. Если количество данных на странице индекса падает ниже этого значения (по умолчанию 50%), когда строка удаляется или укорачивается операцией обновления, InnoDB пытается объединить страницу индекса с соседней страницей индекса.

  5. Используя информацию из 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: 0
    

    INNODB_SYS_FIELDS предоставляет NAME индексированного поля и его порядковый номер в индексе. Если индекс (i1) был определен по нескольким полям, INNODB_SYS_FIELDS предоставит метаданные для каждого из индексированных полей.

  6. Используя информацию из 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 и несколько других элементов метаданных табличного пространства.

  7. Используя информацию из 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 в каталоге data MySQL. Если табличное пространство было создано в месте, отличном от каталога данных MySQL, с использованием предложения DATA DIRECTORY в операторе CREATE TABLE, то табличное пространство PATH будет полным путем к каталогу.

  8. В качестве заключительного шага вставьте строку в таблицу 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.

  1. Создайте тестовую базу данных с родительской и дочерней таблицами:

    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;
    
  2. После создания родительской и дочерней таблиц выполните запрос к 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.

  3. Используя внешний ключ 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: 0
    

    FOR_COL_NAME — имя столбца внешнего ключа в дочерней таблице, а REF_COL_NAME — имя столбца, на который ссылается внешний ключ, в родительской таблице. Значение POS — порядковый номер поля ключа в индексе внешнего ключа, начиная с нуля.


Пример 14.4 Объединение таблиц системы InnoDB INFORMATION_SCHEMA

В этом примере показано объединение трех таблиц системы INFORMATION_SCHEMA (INNODB_SYS_TABLES, INNODB_SYS_TABLESPACES и INNODB_SYS_TABLESTATS) для получения информации о формате файлов, формате строк, размере страниц и размере индекса таблиц в базе данных примеров employees.

Ниже приведены псевдонимы имен таблиц для сокращения строки запроса:

  • INFORMATION_SCHEMA.INNODB_SYS_TABLES: a

  • INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES: b

  • INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS: c

Функция управления потоком 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-information-schema-system-tables.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API