information_schema的tables表
对于mysql和Infobright等数据库,information_schema数据库中的表都是只读的,不能进行更新、删除和插入等操作,也不能加触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件。MySQL的information_schema.tables存储了数据表的元数据信息,它详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。这里我们首先看看information_schame中的表tables的各个字段的含义(代码可左滑):
代码语言:javascript复制mysql 19:36:08>>desc information_schema.tables;
----------------- --------------------- ------ ----- --------- -------
| Field | Type | Null | Key | Default | Extra |
----------------- --------------------- ------ ----- --------- -------
| TABLE_CATALOG | varchar(512) | NO | | | |
| TABLE_SCHEMA | varchar() | NO | | | |
| TABLE_NAME | varchar(64) | NO | | | |
| TABLE_TYPE | varchar() | NO | | | |
| ENGINE | varchar(64) | YES | | NULL | |
| VERSION | bigint() unsigned | YES | | NULL | |
| ROW_FORMAT | varchar(20) | YES | | NULL | |
| TABLE_ROWS | bigint() unsigned | YES | | NULL | |
| AVG_ROW_LENGTH | bigint(21) unsigned | YES | | NULL | |
| DATA_LENGTH | bigint() unsigned | YES | | NULL | |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES | | NULL | |
| INDEX_LENGTH | bigint() unsigned | YES | | NULL | |
| DATA_FREE | bigint(21) unsigned | YES | | NULL | |
| AUTO_INCREMENT | bigint() unsigned | YES | | NULL | |
| CREATE_TIME | datetime | YES | | NULL | |
| UPDATE_TIME | datetime | YES | | NULL | |
| CHECK_TIME | datetime | YES | | NULL | |
| TABLE_COLLATION | varchar() | YES | | NULL | |
| CHECKSUM | bigint(21) unsigned | YES | | NULL | |
| CREATE_OPTIONS | varchar() | YES | | NULL | |
| TABLE_COMMENT | varchar(2048) | NO | | | |
----------------- --------------------- ------ ----- --------- -------
rows in set (. sec)
其中各个字段的含义如下:
TABLE_CATALOG
表所述目录的名称
TABLE_SCHEMA
表所属的模式(数据库)的名称
TABLE_NAME
表名称
TABLE_TYPE
表类型
ENGINE
存储引擎
VERSION
.frm的版本号
ROW_FORMAT
该行的存储格式(Fixed
, Dynamic
,Compressed
, Redundant
,Compact
)
TABLE_ROWS
行数。某些存储引擎(例如 MyISAM
)存储确切的计数。对于其他存储引擎,例如InnoDB
,该值是近似值,并且可以从实际值变化多达40%至50%。在这种情况下,用于SELECT COUNT(*)
获得准确的计数。对于information_schame,table_rows是null
AVG_ROW_LENGTH
平均行长度
DATA_LENGTH
对myisam来讲,它是数据文件的长度,以字节为单位
对于innodb来讲,它是聚簇索引分配的大致内存量,以字节为单位。具体来说,它是聚集索引大小(以页为单位)乘以 InnoDB
页面大小。
MAX_DATA_LENGTH
数据文件的最大长度,在给定数据指针大小的情况下可以存储在表中的数据的总字节数。
INDEX_LENGTH
对myisam来讲,它是索引文件的长度,以字节为单位
对innodb来讲,它是为非聚簇索引分配的近似内存量,以字节为单位,它是非聚集索引大小(以页为单位)乘以InnoDB
页面大小的总和
DATA_FREE
已分配但未使用的字节数。往往用来评估表碎片
AUTO_INCREMENT
下一个AUTO_INCREMENT
值。
CREATE_TIME
创建表的时间
UPDATE_TIME
上次更新数据文件时。对于某些存储引擎,此值为NULL
。例如, InnoDB
在其系统表空间中存储多个表, 并且数据文件时间戳不适用。即使 文件每次表模式与每个InnoDB
在单独的表 .ibd
文件, 改变缓冲 可以延缓写入到数据文件,因此,文件的修改时间是从最后插入的时间不同,更新或删除。对于MyISAM
,使用数据文件时间戳;
CHECK_TIME
上次检查表的时间
TABLE_COLLATION
表的默认排序规则,也称之为字符校验编码集
CHECKSUM
实时校验和值
CREATE_OPTIONS
显示 partitioned
表是否已分区。它还显示了ENCRYPTION
在创建或更改每个表文件表空间时使用的选项。
TABLE_COMMENT
创建表时使用的注释(或有关MySQL无法访问表信息的信息)
表碎片整理
上面tables表中提到的data_free字段,就是表碎片的一个指标,当我们发现了表存在碎片时,有两种方法进行整理优化:
第一种是MySQL自身的优化:MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分。如果在一个碎片率很高的表进行新的插入操作,MySQL将尝试利用那些留空的区域,但是由于插入数据的不确定性,这些留空的内存区域仍然无法被彻底占用。
第二种是人为干预的优化:使用optimize语法进行优化,即
Optimize table tbl_name