11.2 使用InnoDB层的字典表查询相关的元数据信息
11.2.1 查看索引列的信息
INNODB_SYS_FIELDS表提供查询有关InnoDB索引列(字段)的元数据信息,等同于InnoDB数据字典中SYS_FIELDS表的信息。
INNODB_SYS_INDEXES表提供查询有关InnoDB索引的元数据信息,等同于InnoDB数据字典内部SYS_INDEXES表中的信息。
INNODB_SYS_TABLES表提供查询有关InnoDB表的元数据信息,等同于InnoDB数据字典中SYS_TABLES表的信息。
假设需要查询employees库下的InnoDB表dept_emp的索引列名称和索引列顺序信息,则可以使用如下SQL语句进行查询。
mysql> select t.name as d_t_name, i.name as i_name, i.type as i_type, i.N_FIELDS as i_column_numbers, f.name as i_column_name, f.pos as i_position from INNODB_SYS_TABLES as t join INNODB_SYS_INDEXES as i on t.TABLE_ID=i.TABLE_ID left join INNODB_SYS_FIELDS as f on i.INDEX_ID=f.INDEX_ID where t.name='employees/dept_emp'; +-----------------+---------+--------+----------------+---------------+------------+ | d_t_name | i_name | i_type | i_column_numbers | i_column_name | i_position | +-----------------+---------+--------+----------------+---------------+------------+ |employees/dept_emp|PRIMARY | 3 | 2 | emp_no | 0 | |employees/dept_emp|PRIMARY | 3 | 2 | dept_no | 1 | |employees/dept_emp|emp_no | 0 | 1 | emp_no | 0 | |employees/dept_emp|dept_no | 0 | 1 | dept_no | 0 | +-----------------+---------+--------+----------------+---------------+------------+ 4 rows in set(0.01 sec)
从上面的结果集中可以看到,employees库下的dept_emp表有三个索引,即一个双列主键索引和两个单列普通索引。下面对查询结果做一个简单的解读。
● d_t_name(INNODB_SYS_TABLES.name):表名称。该字符串包含db_name+tb_name,例如“test/t1”,该字符串值可能受lower_case_table_names系统参数设置的影响。
● i_name(INNODB_SYS_INDEXES.name):索引名称。索引名称可以在创建时指定,如果不指定,InnoDB将隐式创建名称与列名一致的索引,但索引名称在整个实例中不一定是唯一的(在每个表中需要唯一)。例如,PRIMARY用于主键索引,GEN_CLUST_INDEX用于表示未指定主键时InnoDB隐式创建的一个主键索引,ID_IND、FOR_IND和REF_IND用于外键约束等。
● i_type(INNODB_SYS_INDEXES.type):表示索引类型的数字ID,0 =二级索引、1 =集群索引、2 =唯一索引、3 =主键索引、32 =全文索引、64 =空间索引、128 =包含虚拟生成列的二级索引。
● i_column_numbers(INNODB_SYS_INDEXES.N_FIELDS):索引key中的列数量。对于GEN_CLUST_INDEX索引(InnoDB隐式创建的主键索引),此列值为0,因为该索引是使用伪造的列值而非实际表的列值创建的。
● i_column_name(INNODB_SYS_FIELDS.name):索引列的名称,与INNODB_SYS_COLUMNS表中的NAME字段值相同。
● i_position(INNODB_SYS_FIELDS.pos):索引列的序号位置,从0开始并依次递增。当一个列被删除时,剩下的列被重新排序,以便该序列无间隙。
11.2.2 查看表的字段相关信息
INNODB_SYS_TABLES表提供查询有关InnoDB表的元数据,等同于InnoDB数据字典中SYS_TABLES表的信息。
INNODB_SYS_COLUMNS表提供查询有关InnoDB表字段的元数据信息,等同于InnoDB数据字典中SYS_COLUMNS表的信息。
假设需要查询employees库下的dept_emp表的字段信息,则可以使用如下SQL语句进行查询。
mysql> select t.name as db_table_name, c.name as column_name, c.pos as column_position, c.mtype as column_type, c.len as column_len from INNODB_SYS_TABLES as t, INNODB_SYS_COLUMNS as c where t.TABLE_ID=c.TABLE_ID and t.name='employees/dept_emp'; +--------------------+-------------+-----------------+-------------+------------+ | db_table_name | column_name | column_position | column_type | column_len | +--------------------+-------------+-----------------+-------------+------------+ | employees/dept_emp | emp_no | 0 | 6 | 4 | | employees/dept_emp | dept_no | 1 | 13 | 12 | | employees/dept_emp | from_date | 2 | 6 | 3 | | employees/dept_emp | to_date | 3 | 6 | 3 | +--------------------+-------------+-----------------+-------------+------------+ 4 rows in set(0.00 sec)
下面对查询结果做一个简单的解读。
● db_table_name(INNODB_SYS_TABLES.name):表名称。该字符串包含db_name+tb_name,例如“test/t1”,该字符串值可能受lower_case_table_names系统参数设置的影响。
● column_name(INNODB_SYS_COLUMNS.name):字段名称,该名称可以是大写字母,也可以是小写字母,具体取决于lower_case_table_names系统变量的设置。
● column_position(INNODB_SYS_COLUMNS.pos):字段在表中的顺序位置,从0开始并依次递增。当一个字段被删除时,剩下的字段会被重新排序,以使得该序列无间隙。
● column_type(INNODB_SYS_COLUMNS.mtype):表示字段类型的数字ID。1 =VARCHAR、2 = CHAR、3 = FIXBINARY、4 = BINARY、5 = BLOB、6 = INT、7 =SYS_CHILD、8 = SYS、9 = FLOAT、10 = DOUBLE、11 = DECIMAL、12 =VARMYSQL、13 = MYSQL、14 = GEOMETRY。
● column_len(INNODB_SYS_COLUMNS.len):字段字节长度,例如INT为4字节,BIGINT为8字节。对于多字节字符集中的字段字节长度,此长度值是为定义长度所需的最大字节数。比如VARCHAR(N),如果字符集为Latin1,则该字段的字节长度为N;如果字符集为GBK,则长度为2N;如果字符集为UTF-8,则长度为3N。
11.2.3 查看事务锁等待信息
详见9.2节“查看是否有事务锁等待”。
11.2.4 查看InnoDB缓冲池中的热点数据有哪些
详见9.4节“查看InnoDB缓冲池中的热点数据有哪些”。
温馨提示:
● 关于文中提到的参数的详细解释,可参考本书下载资源中的“附录C”。
● 关于information_schema系统库更详细的内容,可参阅微信公众号“沃趣技术”,其中我们用11个章节对其进行了全方位的介绍。