千金良方:MySQL性能优化金字塔法则
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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个章节对其进行了全方位的介绍。