前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL之表碎片简介

MySQL之表碎片简介

作者头像
AsiaYe
发布2019-11-06 15:28:28
1.1K0
发布2019-11-06 15:28:28
举报
文章被收录于专栏:DBA随笔DBA随笔
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档