InnoDB INFORMATION_SCHEMA临时表信息表
INNODB_TEMP_TABLE_INFO表为用户提供了一个活动的InnoDB临时表的快照。这张表包含了除InnoDB内部使用的优化过的临时表之外的所有用户和系统创建的临时表的元数据,这些临时表在给定的InnoDB实例中是活动的。
mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_TEMP%'; +---------------------------------------------+ | Tables_in_information_schema (INNODB_TEMP%) | +---------------------------------------------+ | INNODB_TEMP_TABLE_INFO | +---------------------------------------------+ 1 row in set (0.00 sec)
下面这个例子将展示了INNODB_TEMP_TABLE_INFO表的特征。
1.创建一个单列的简单InnoDB临时表:
mysql> CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB; Query OK, 0 rows affected (0.01 sec)
2.查询INNODB_TEMP_TABLE_INFO表查看临时表的元数据。
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G *************************** 1. row *************************** TABLE_ID: 537 NAME: #sql1d89_101_0 N_COLS: 4 SPACE: 444 PER_TABLE_TABLESPACE: FALSE IS_COMPRESSED: FALSE 1 row in set (0.00 sec)
TABLE_ID是临时表的唯一标识符。NAME列显示了系统生成的临时表的名称,前缀是“#sql”。列数(N_COLS)是4而不是1,因为InnoDB总是创建3个隐藏表列(DB_ROW_ID、DB_TRX_ID和DB_ROLL_PTR)。PER_TABLE_TABLESPACE和IS_COMPRESSED仅对压缩的临时表报告为TRUE。
3.创建一个压缩的临时表。在此之前,确保innodb_file_format设置为Barracuda,这是创建压缩行格式的表所必需的。
mysql> SET GLOBAL innodb_file_format="Barracuda"; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE TEMPORARY TABLE t2 (c1 INT) ROW_FORMAT=COMPRESSED ENGINE=INNODB; Query OK, 0 rows affected (0.00 sec)
4.再次查询INNODB_TEMP_TABLE_INFO表。
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G *************************** 1. row *************************** TABLE_ID: 538 NAME: #sql1d89_101_1 N_COLS: 4 SPACE: 536 PER_TABLE_TABLESPACE: TRUE IS_COMPRESSED: TRUE *************************** 2. row *************************** TABLE_ID: 537 NAME: #sql1d89_101_0 N_COLS: 4 SPACE: 444 PER_TABLE_TABLESPACE: FALSE IS_COMPRESSED: FALSE 2 rows in set (0.00 sec)
对于压缩临时表,PER_TABLE_TABLESPACE和IS_COMPRESSED报告为TRUE。压缩临时表的空间ID是不同的,因为压缩临时表是在单独的per-table表空间中创建的。非压缩临时表共享一个表空间(默认情况下是ibtmp1),并且报告相同的空间ID。
5.重启MySQL并查询INNODB_TEMP_TABLE_INFO表。
[root@localhost mysql]# service mysqld restart Shutting down MySQL.... SUCCESS! Starting MySQL... SUCCESS! mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G Empty set (0.00 sec)
返回一个空集合,因为INNODB_TEMP_TABLE_INFO表和其中的数据在服务器关闭时没有持久化到磁盘。
6.创建一个新的临时表。
mysql> CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB; Query OK, 0 rows affected (0.00 sec)
7.查询INNODB_TEMP_TABLE_INFO表查看临时表的元数据。
mysql> CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G *************************** 1. row *************************** TABLE_ID: 539 NAME: #sql216d_2_0 N_COLS: 4 SPACE: 537 PER_TABLE_TABLESPACE: FALSE IS_COMPRESSED: FALSE 1 row in set (0.00 sec)
空间ID是新的,因为它是在服务器重启时动态生成的。