在上一篇《InnoDB 层全文索引字典表|全方位认识 information_schema》中,我们详细介绍了InnoDB层的全文索引字典表,本期我们将为大家带来系列第八篇《InnoDB 层压缩相关字典表|全方位认识 information_schema》,下面请跟随我们一起开始 information_schema 系统库的系统学习之旅吧。
| INNODB_CMP和INNODB_CMP_RESET
这两个表中的数据包含了与压缩的InnoDB表页有关的操作的状态信息。表中记录的数据为测量数据库中的InnoDB表压缩的有效性提供参考。
- 查询该表的用户必须具有PROCESS权限,该表为Memory引擎临时表
下面是该表中存储的信息内容
代码语言:javascript复制# INNODB_CMP表
root@localhost : information_schema 11:02:28> select * from INNODB_CMP;
----------- -------------- ----------------- --------------- ---------------- -----------------
| page_size | compress_ops | compress_ops_ok | compress_time | uncompress_ops | uncompress_time |
----------- -------------- ----------------- --------------- ---------------- -----------------
| 1024 | 0 | 0 | 0 | 0 | 0 |
| 2048 | 0 | 0 | 0 | 0 | 0 |
| 4096 | 0 | 0 | 0 | 0 | 0 |
| 8192 | 0 | 0 | 0 | 0 | 0 |
| 16384 | 0 | 0 | 0 | 0 | 0 |
----------- -------------- ----------------- --------------- ---------------- -----------------
5 rows in set (0.00 sec)
# INNODB_CMP_RESET表
root@localhost : information_schema 11:33:00> select * from INNODB_CMP_RESET;
----------- -------------- ----------------- --------------- ---------------- -----------------
| page_size | compress_ops | compress_ops_ok | compress_time | uncompress_ops | uncompress_time |
----------- -------------- ----------------- --------------- ---------------- -----------------
| 1024 | 0 | 0 | 0 | 0 | 0 |
| 2048 | 0 | 0 | 0 | 0 | 0 |
| 4096 | 0 | 0 | 0 | 0 | 0 |
| 8192 | 0 | 0 | 0 | 0 | 0 |
| 16384 | 0 | 0 | 0 | 0 | 0 |
----------- -------------- ----------------- --------------- ---------------- -----------------
5 rows in set (0.00 sec)
字段含义如下:
- PAGE_SIZE:表示压缩的页有效块大小(以字节为单位),例如:默认page size值为16K,则可压缩的块大小为16K、8K、4K、2K、1K,注意:这里的块大小指的是建表选项中指定的block size
- COMPRESS_OPS:表示PAGE_SIZE字段值大小的BTREE页被压缩的次数。当创建一个空白页或者非压缩页的修改日志空间用完,页都会被压缩
- COMPRESS_OPS_OK:表示PAGE_SIZE字段值大小的BTREE页成功压缩的次数。此计数不应超过COMPRESS_OPS字段值
- COMPRESS_TIME:尝试压缩大小为PAGE_SIZE字段值的BTREE页所花费的总时间(以秒为单位)
- UNCOMPRESS_OPS:表示PAGE_SIZE字段值大小的BTREE页被解压缩的次数。 B-tree页面在压缩失败时或在首次访问一个压缩页时在缓冲池中不存时被解压
- UNCOMPRESS_TIME:解压缩PAGE_SIZE字段值大小的BTREE页所用的总时间(单位秒)
| INNODB_CMP_PER_INDEX和INNODB_CMP_PER_INDEX_RESET
这两个表中记录着InnoDB压缩表数据和索引相关的操作状态信息,对数据库、表、索引的每个组合使用不同的统计信息,以便为评估特定表的压缩性能和实用性提供参考数据
- 对于InnoDB压缩表,会对表中的数据和所有二级索引都进行压缩。此时表中的数据被视为另一个索引(包含所有数据列的聚集索引)
- 注意:由于为每个索引收集单独的度量值会导致性能大幅度降低,因此默认情况下不收集INNODB_CMP_PER_INDEX和INNODB_CMP_PER_INDEX_RESET表统计信息。如果确有需要,启用系统配置参数innodb_cmp_per_index_enabled即可(该配置参数为动态变量,默认为OFF)。
- 查询该表的账户需要有PROCESS权限,该表为Memory引擎临时表
下面是该表中存储的信息内容
代码语言:javascript复制# 需要先启用innodb_cmp_per_index_enabled系统参数为ON,然后在innodb表中使用建表选项key_block_size指定一个小于默认的page size的块大小时才会有数据
## INNODB_CMP_PER_INDEX表
root@localhost : test 12:38:08> select * from information_schema.INNODB_CMP_PER_INDEX;
--------------- ------------ ------------ -------------- ----------------- --------------- ---------------- -----------------
| database_name | table_name | index_name | compress_ops | compress_ops_ok | compress_time | uncompress_ops | uncompress_time |
--------------- ------------ ------------ -------------- ----------------- --------------- ---------------- -----------------
| test | test | i_id | 4 | 4 | 0 | 0 | 0 |
--------------- ------------ ------------ -------------- ----------------- --------------- ---------------- -----------------
1 row in set (0.00 sec)
## INNODB_CMP_PER_INDEX_RESET表
root@localhost : test 12:38:11> select * from information_schema.INNODB_CMP_PER_INDEX_RESET;
--------------- ------------ ------------ -------------- ----------------- --------------- ---------------- -----------------
| database_name | table_name | index_name | compress_ops | compress_ops_ok | compress_time | uncompress_ops | uncompress_time |
--------------- ------------ ------------ -------------- ----------------- --------------- ---------------- -----------------
| test | test | i_id | 4 | 4 | 0 | 0 | 0 |
--------------- ------------ ------------ -------------- ----------------- --------------- ---------------- -----------------
1 row in set (0.00 sec)
字段含义如下:
- DATABASE_NAME:包含压缩表的数据库名称
- TABLE_NAME:被监视压缩状态的表名称
- INDEX_NAME:被监视压缩状态的索引名称
- COMPRESS_OPS:尝试压缩操作的次数。当创建一个空白页或者非压缩页的修改日志的空间用完时,页都会被压缩
- COMPRESS_OPS_OK:成功压缩操作的次数
- COMPRESS_TIME:表示用于压缩INDEX_NAME列表示的索引中的数据时的CPU开销时间总量(以秒为单位)
- UNCOMPRESS_OPS:执行解压缩操作的次数。InnoDB页在压缩失败时,或者第一次访问的压缩页在缓冲池不存在时,则将进行解压缩操作
- UNCOMPRESS_TIME:表示用于解压缩INDEX_NAME列表示的索引中的数据时的CPU开销时间总量(以秒为单位)
| INNODB_CMPMEM和INNODB_CMPMEM_RESET
这两个表中记录着InnoDB缓冲池中压缩页上的状态信息,为测量数据库中InnoDB表压缩的有效性提供参考
- 查询该表的账户需要有PROCESS权限,该表为Memory引擎临时表
下面是该表中存储的信息内容
代码语言:javascript复制# INNODB_CMPMEM表
root@localhost : information_schema 11:33:15> select * from INNODB_CMPMEM;
----------- ---------------------- ------------ ------------ ---------------- -----------------
| page_size | buffer_pool_instance | pages_used | pages_free | relocation_ops | relocation_time |
----------- ---------------------- ------------ ------------ ---------------- -----------------
| 1024 | 0 | 0 | 0 | 0 | 0 |
| 2048 | 0 | 0 | 0 | 0 | 0 |
| 4096 | 0 | 0 | 0 | 0 | 0 |
| 8192 | 0 | 0 | 0 | 0 | 0 |
| 16384 | 0 | 0 | 0 | 0 | 0 |
| 1024 | 1 | 0 | 0 | 0 | 0 |
| 2048 | 1 | 0 | 0 | 0 | 0 |
| 4096 | 1 | 0 | 0 | 0 | 0 |
| 8192 | 1 | 0 | 0 | 0 | 0 |
| 16384 | 1 | 0 | 0 | 0 | 0 |
| 1024 | 2 | 0 | 0 | 0 | 0 |
| 2048 | 2 | 0 | 0 | 0 | 0 |
| 4096 | 2 | 0 | 0 | 0 | 0 |
| 8192 | 2 | 0 | 0 | 0 | 0 |
| 16384 | 2 | 0 | 0 | 0 | 0 |
| 1024 | 3 | 0 | 0 | 0 | 0 |
| 2048 | 3 | 0 | 0 | 0 | 0 |
| 4096 | 3 | 0 | 0 | 0 | 0 |
| 8192 | 3 | 0 | 0 | 0 | 0 |
| 16384 | 3 | 0 | 0 | 0 | 0 |
----------- ---------------------- ------------ ------------ ---------------- -----------------
20 rows in set (0.00 sec)
# INNODB_CMPMEM_RESET表
root@localhost : information_schema 11:44:01> select * from INNODB_CMPMEM_RESET;
----------- ---------------------- ------------ ------------ ---------------- -----------------
| page_size | buffer_pool_instance | pages_used | pages_free | relocation_ops | relocation_time |
----------- ---------------------- ------------ ------------ ---------------- -----------------
| 1024 | 0 | 0 | 0 | 0 | 0 |
| 2048 | 0 | 0 | 0 | 0 | 0 |
| 4096 | 0 | 0 | 0 | 0 | 0 |
| 8192 | 0 | 0 | 0 | 0 | 0 |
| 16384 | 0 | 0 | 0 | 0 | 0 |
| 1024 | 1 | 0 | 0 | 0 | 0 |
| 2048 | 1 | 0 | 0 | 0 | 0 |
| 4096 | 1 | 0 | 0 | 0 | 0 |
| 8192 | 1 | 0 | 0 | 0 | 0 |
| 16384 | 1 | 0 | 0 | 0 | 0 |
| 1024 | 2 | 0 | 0 | 0 | 0 |
| 2048 | 2 | 0 | 0 | 0 | 0 |
| 4096 | 2 | 0 | 0 | 0 | 0 |
| 8192 | 2 | 0 | 0 | 0 | 0 |
| 16384 | 2 | 0 | 0 | 0 | 0 |
| 1024 | 3 | 0 | 0 | 0 | 0 |
| 2048 | 3 | 0 | 0 | 0 | 0 |
| 4096 | 3 | 0 | 0 | 0 | 0 |
| 8192 | 3 | 0 | 0 | 0 | 0 |
| 16384 | 3 | 0 | 0 | 0 | 0 |
----------- ---------------------- ------------ ------------ ---------------- -----------------
20 rows in set (0.00 sec)
字段含义如下:
- PAGE_SIZE:表示innodb的块大小(即表中可以使用的有效的压缩块大小,以字节为单位)。该表中的每个记录都描述了有效的可用块大小(每个buffer pool instance在该表中都记录了完整的可压缩的有效块大小值,例如:默认page size值为16K,则可压缩的块大小为16K、8K、4K、2K、1K,注意:这里的块大小指的是使用建表选项指定的block size)
- BUFFER_POOL_INSTANCE:buffer pool instance实例的唯一标识符
- PAGES_USED:表示对应每行记录中的PAGE_SIZE块大小的块数(页数)
- PAGES_FREE:表示每行记录对应的PAGE_SIZE块大小的当前可分配的块数。此列显示内存池中的外部碎片。理想情况下,该列值不应该超过1
- RELOCATION_OPS:表示PAGE_SIZE列值对应的块大小的块被重新设置的次数。当伙伴系统试图建立一个大块的空闲区域时,伙伴系统可以重新分配邻接页释放的空间。从表INNODB_CMPMEM_RESET中读同名列值取重置INNODB_CMPMEM表中该列的计数
- RELOCATION_TIME:重新设置PAGE_SIZE列值大小的块大小的块所用的总时间(以微秒为单位)。从表INNODB_CMPMEM_RESET读取相同列值来重置INNODB_CMPMEM表中的该列计数
本期内容就介绍到这里,本期内容参考链接如下:
https://dev.mysql.com/doc/refman/5.7/en/innodb-cmp-table.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-cmp-per-index-table.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-cmpmem-table.html
| 作者简介
罗小波·数据库技术专家
《千金良方——MySQL性能优化金字塔法则》、《数据生态:MySQL复制技术与生产实践》作者之一。熟悉MySQL体系结构,擅长数据库的整体调优,喜好专研开源技术,并热衷于开源技术的推广,在线上线下做过多次公开的数据库专题分享,发表过近100篇数据库相关的研究文章。
全文完。