MySQL之表碎片简介

2019-11-06 15:28:28 浏览数 (1)

MySQL之表碎片简介
今天简单讲讲MySQL中的表碎片,改天我们详细展开这个概念。我们在维护一张MySQL的表的时候,往往会对这些表中的冗余数据进行一些删除操作,当我们删除了列表中的一行内容的时候,这段空间就被留空,到某个特定的时间点,这种留空的空间会比表本身的内容所占用的空间更大,这是我们不希望看到的。当这种删除操作频繁进行的时候,往往就会造成大量的表碎片,影响表的存储效率,降低内存的利用率。要想知道表的碎片的详细信息,我们首先需要观察一张表:information_schema中的tables表,如下:

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

该行的存储格式(FixedDynamicCompressedRedundantCompact

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

0 人点赞