InnoDB INFORMATION_SCHEMA架构对象表
您可以提取有关InnoDB
使用InnoDB
INFORMATION_SCHEMA
表管理的架构对象的元数据。此信息来自数据字典。传统上,您将使用“ InnoDB监视器”中的技术获取此类信息,设置InnoDB
监视器并解析该SHOW ENGINE INNODB STATUS
语句的输出。该InnoDB
INFORMATION_SCHEMA
表界面,您可以使用SQL查询该数据。
InnoDB
INFORMATION_SCHEMA
模式对象表包括下面列出的表。
INNODB_DATAFILES INNODB_TABLESTATS INNODB_FOREIGN INNODB_COLUMNS INNODB_INDEXES INNODB_FIELDS INNODB_TABLESPACES INNODB_TABLESPACES_BRIEF INNODB_FOREIGN_COLS INNODB_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文档。
例15.2 InnoDB INFORMATION_SCHEMA模式对象表
本示例使用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 i1ON t1(col1);创建表后
t1
,查询INNODB_TABLES
以查找以下内容的元数据test/t1
:mysql>
SELECT *FROM INFORMATION_SCHEMA.INNODB_TABLESWHERE 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
aTABLE_ID
为71。该FLAG
字段提供有关表格式和存储特性的位级别信息。有六列,其中三个是通过创建隐藏的列InnoDB
(DB_ROW_ID
,DB_TRX_ID
,和DB_ROLL_PTR
)。该表的IDSPACE
为57(值为0表示该表位于系统表空间中)。该ROW_FORMAT
紧凑。ZIP_PAGE_SIZE
仅适用于具有Compressed
行格式的表。INSTANT_COLS
显示在使用ALTER TABLE ... ADD COLUMN
with 添加第一个即时列之前的表中的列数ALGORITHM=INSTANT
。使用
TABLE_ID
来自中的信息INNODB_TABLES
,在INNODB_COLUMNS
表中查询有关表列的信息。mysql>
SELECT *FROM INFORMATION_SCHEMA.INNODB_COLUMNSwhere 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开始并依次递增),柱的)MTYPE
或“主要类型”(6 = INT,2 = CHAR,1 = VARCHAR)时,PRTYPE
或“精确type ”(一个二进制值,其位表示MySQL数据类型,字符集代码和可空性)和列长度(LEN
)。在HAS_DEFAULT
与DEFAULT_VALUE
列仅适用于使用即时添加的列ALTER TABLE ... ADD COLUMN
用ALGORITHM=INSTANT
。再次使用
TABLE_ID
来自的信息INNODB_TABLES
,查询INNODB_INDEXES
有关与table关联的索引的信息t1
。mysql>
SELECT *FROM INFORMATION_SCHEMA.INNODB_INDEXESWHERE 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
是索引所在的表空间的ID。非零值表示索引未驻留在系统表空间中。MERGE_THRESHOLD
定义索引页中数据量的百分比阈值。如果在删除行或通过更新操作缩短行时索引页中的数据量低于此值(默认值为50%),请InnoDB
尝试将索引页与相邻的索引页合并。使用
INDEX_ID
来自的信息INNODB_INDEXES
,查询INNODB_FIELDS
有关索引字段的信息i1
。mysql>
SELECT *FROM INFORMATION_SCHEMA.INNODB_FIELDSwhere INDEX_ID = 112 \G *************************** 1. row *************************** INDEX_ID : 112 NAME : col1 POS : 0INNODB_FIELDS
提供NAME
索引字段的索引及其在索引中的顺序位置。如果索引(i1)已在多个字段上定义,INNODB_FIELDS
则将为每个索引字段提供元数据。使用
SPACE
来自中的信息INNODB_TABLES
,查询INNODB_TABLESPACES
表以获取有关表表空间的信息。mysql>
SELECT *FROM INFORMATION_SCHEMA.INNODB_TABLESPACESWHERE 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 SERVER_VERSION : 8.0.4 SPACE_VERSION : 1 ENCRYPTION : N除了
SPACE
表空间的ID和NAME
关联表的ID外,INNODB_TABLESPACES
还提供表空间FLAG
数据,该数据是有关表空间格式和存储特性的位级别信息。还提供了tablespaceROW_FORMAT
,PAGE_SIZE
和其他几个表空间元数据项。再次使用这些
SPACE
信息INNODB_TABLES
,查询INNODB_DATAFILES
表空间数据文件的位置。mysql>
SELECT *FROM INFORMATION_SCHEMA.INNODB_DATAFILESWHERE SPACE = 57 \G *************************** 1. row *************************** SPACE : 57 PATH : ./test/t1.ibd数据文件位于
test
MySQL目录下的data
目录中。如果使用该语句的子句在MySQL数据目录之外的位置中创建了每个表文件表空间,则该表空间将是标准目录路径。DATA DIRECTORY
CREATE TABLE
PATH
最后一步,在表格
t1
(TABLE_ID = 71
)中插入一行,并参见INNODB_TABLESTATS
表格中的数据。MySQL优化程序使用该表中的数据来计算查询InnoDB
表时要使用的索引。此信息来自内存中的数据结构。mysql>
INSERT INTO t1VALUES (5, 'abc', 'def'); Query OK, 1 row affected (0.06 sec) mysql>SELECT *FROM INFORMATION_SCHEMA.INNODB_TABLESTATSwhere 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
值是针对任何基于自动增量的操作要发出的下一个数字。在table上没有定义自动增量列t1
,因此该值为0。REF_COUNT
值是一个计数器。当计数器达到0时,表示可以从表缓存中逐出表元数据。
例15.3外键INFORMATION_SCHEMA模式对象表
在INNODB_FOREIGN
和INNODB_FOREIGN_COLS
表格提供了有关外键关系数据。本示例使用具有外键关系的父表和子表来演示在INNODB_FOREIGN
and 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 fk1FOREIGN 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_COLSWHERE 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
值是外键索引中键字段的顺序位置,从零开始。
例15.4连接InnoDB INFORMATION_SCHEMA模式对象表
本示例演示如何联接三个InnoDB
INFORMATION_SCHEMA
模式对象表(INNODB_TABLES
,INNODB_TABLESPACES
和INNODB_TABLESTATS
),以收集有关雇员样本数据库中表的文件格式,行格式,页面大小和索引大小信息。
下表名称别名用于缩短查询字符串:
INFORMATION_SCHEMA.INNODB_TABLES
:一种INFORMATION_SCHEMA.INNODB_TABLESPACES
:bINFORMATION_SCHEMA.INNODB_TABLESTATS
: C
一个IF()
控制流功能用于帐户压缩的表。如果表被压缩,则使用ZIP_PAGE_SIZE
而不是来计算索引大小PAGE_SIZE
。CLUST_INDEX_SIZE
和OTHER_INDEX_SIZE
(以字节为单位)被除以1024*1024
提供兆字节(MB)的索引大小。MB值使用该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_mbFROM INFORMATION_SCHEMA.INNODB_TABLES aINNER JOIN INFORMATION_SCHEMA.INNODB_TABLESPACES bon a.NAME = b.NAME INNER JOIN INFORMATION_SCHEMA.INNODB_TABLESTATS con 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 | +------------------------ +------------ +----------- +------- +----------- +