MYSQL优化之数据表碎片整理详解

目录

在MySQL中,我们经常会使用VARCHAR、TEXT、BLOB等可变长度的文本数据类型。不过,当我们使用这些数据类型之后,我们就不得不做一些额外的工作——MySQL数据表碎片整理。

那么,为什么在使用这些数据类型之后,我们就要对MySQL定期进行碎片整理呢?

现在,我们先来看一个具体的例子。在这里,我们使用如下SQL语句在MySQL自带的TEST数据库中创建名为DEMO的数据表并插入5条测试数据。

--创建DEMO表
CREATE TABLE DEMO(
id int	unsigned,
body text
) engine=myisam charset=utf8;

--插入5条测试数据
INSERT INTO DEMO VALUES(1,'AAAAA');
INSERT INTO DEMO VALUES(2,'BBBBB');
INSERT INTO DEMO VALUES(3,'CCCCC');
INSERT INTO DEMO VALUES(4,'DDDDD');
INSERT INTO DEMO VALUES(5,'EEEEE');

然后我们以这5条测试数据为基础,使用如下INSERT INTO语句重复执行多次进行复制性插入。

INSERT INTO DEMO SELECT id, body FROM DEMO;

使用INSERT INTO语句多次插入产生总共约262万条数据

众所周知,MySQL中MyISAM表的数据是以文件形式存储的,我们可以在MySQL存储数据的文件夹中找到数据库test目录下的demo.MYD文件。此时,我们可以看到demo.MYD文件的大小约为50MB。

demo.MYD文件约为50MB

此时,假如我们需要删除DEMO表中所有ID列小于3的数据(即1和2),于是我们执行如下SQL语句:

DELETE FROM DEMO WHERE id < 3

此时,我们可以看到DEMO表中的数据量只有原来的3/5:

删除后,只剩下157万条记录

DEMO表中的现有数据量只有原来的3/5,按理说,这个时候demo.MYD文件的大小也应该只有原来的3/5左右。不过,我们再次查看demo.MYD文件时,却惊奇地发现该文件的大小一点都没有变!

删除数据后,demo.MYD的文件大小没有变化

那么就究竟是怎么一回事呢?原来,在MySQL中,如果我们删除了表中的大量数据,或者我们对含有可变长度文本数据类型(VARCHAR,TEXT或BLOB)的表进行了很多更改,不过被删除的数据记录仍然被保持在MySQL的链接清单中,因此数据存储文件的大小并不会随着数据的删除而减小。

当我们确定数据需要被清除掉时,那么这些数据就已经成了无用的数据,但是按照MySQL的处理方式,这些数据仍然会占用我们的磁盘空间,从而造成了极大的资源浪费。不仅如此,过大的数据文件还会导致MySQL执行相关数据操作时需要耗费更多的性能和时间。因此,对MySQL的某些数据表进行碎片整理是非常有必要的。

对MySQL进行碎片整理的方法非常简单,因为MySQL已经给我们提供了对应的SQL指令,这个SQL指令就是OPTIMIZE TABLE,其完整语法如下:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE table_name1 [, table_name2] ...

从上面的语法描述中,我们可以得知,OPTIMIZE TABLE可以一次性对多个表进行碎片整理,只需要在OPTIMIZE TABLE后面接多个表名,并以英文逗号隔开即可。

此外,OPTIMIZE TABLE语句有两个可选的关键字:LOCAL和NO_WRITE_TO_BINLOG。在默认情况下,OPTIMIZE TABLE语句将会被记录到二进制日志中,如果我们指定了LOCAL或NO_WRITE_TO_BINLOG关键字,则不会记录。当然,一般情况下,我们也无需关注这两个关键字。

现在,我们就使用OPTIMIZE TABLE语句对刚才的DEMO表进行碎片整理。

对demo表进行碎片整理

然后,我们再来查看demo.MYD文件,此时我们就会发现demo.MYD文件的大小已经减小到约为原来的3/5了。

碎片整理后demo.MYD文件的大小

备注:

1.MySQL官方建议不要经常(每小时或每天)进行碎片整理,一般根据实际情况,只需要每周或者每月整理一次即可。

2.OPTIMIZE TABLE只对MyISAM,BDB和InnoDB表起作用,尤其是MyISAM表的作用最为明显。此外,并不是所有表都需要进行碎片整理,一般只需要对包含上述可变长度的文本数据类型的表进行整理即可。

3.在OPTIMIZE TABLE运行过程中,MySQL会锁定表。

4.默认情况下,直接对InnoDB引擎的数据表使用OPTIMIZE TABLE,可能会显示「 Table does not support optimize, doing recreate + analyze instead」的提示信息。这个时候,我们可以用mysqld --skip-new或者mysqld --safe-mode命令来重启MySQL,以便于让其他引擎支持OPTIMIZE TABLE。

总结

到此这篇关于MYSQL优化之数据表碎片整理的文章就介绍到这了,更多相关MYSQL数据表碎片整理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL表的碎片整理和空间回收的方法

    目录 MySQL表碎片化(Table Fragmentation)的原因 行碎片(Row fragmentation) 行间碎片(Intra-row fragmentaion) 剩余空间碎片(Free space fragmentation) MySQL中如何找出碎片化严重的表 方法1:使用show table status from xxxx like 'xxxx' \G; 方法2:查询information_schema.TABLES获取表的碎片化信息. MySQL中如何减低表的碎片 OPT

  • MySQL 表空间碎片的概念及相关问题解决

    背景 经常使用 MySQL 的话,会发现 MySQL 数据文件的磁盘空间一般会不停的增长,而且有时候删了数据或者插入一批数据的时候,磁盘空间有时候还会毫无变化.引发这个其妙现象的就是 MySQL 的表空间碎片. 什么是表空间碎片? 表空间碎片指的是表空间中存在碎片,形象一点来比喻的话,就像是一张 A4 纸,"表空间碎片"就像是把这张 A4 纸撕碎,再重新拼起来,各个碎片之间都会有一些缝隙存在,这些缝隙就是"表空间碎片".重新拼起来的碎片实际上会比完整的 A4 纸大上

  • 解析mysql 表中的碎片产生原因以及清理

    大量删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来 .对于不同的存储引擎整理碎片的方式不一样.myisam可以有以下方式:mysql> show table status from test like 'testusers'\G*************************** 1. row ***************************  ....           Rows: 3 Avg_row_length: 45        

  • MySQL 清除表空间碎片的实例详解

    MySQL 清除表空间碎片的实例详解 碎片产生的原因 (1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白.被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大: (2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片: (3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分: 例如: 一个表有1万行

  • mysql sharding(碎片)介绍

    1.Sharding 的应用场景一般都那些? 当数据库中的数据量越来越大时,不论是读还是写,压力都会变得越来越大.试想,如果一张表中的数据量达到了千万甚至上亿级别的时候,不管是建索引,优化缓存等,都会面临巨大的性能压力.sharding通过某种条件,把同一个数据库中的数据分散到多个数据库或多台机器上,以减小单台机器压力. 联机游戏.IM.BSP 都是比较适合 Sharding 的应用场景: 2.Sharding与数据库分区(Partition)的区别? sharding实现了数据的分布式部署,将

  • MYSQL优化之数据表碎片整理详解

    目录 在MySQL中,我们经常会使用VARCHAR.TEXT.BLOB等可变长度的文本数据类型.不过,当我们使用这些数据类型之后,我们就不得不做一些额外的工作——MySQL数据表碎片整理. 那么,为什么在使用这些数据类型之后,我们就要对MySQL定期进行碎片整理呢? 现在,我们先来看一个具体的例子.在这里,我们使用如下SQL语句在MySQL自带的TEST数据库中创建名为DEMO的数据表并插入5条测试数据. --创建DEMO表 CREATE TABLE DEMO( id int unsigned,

  • MySql中删除数据表的方法详解

    目录 定义: 1 删除一个或多个没有被其他表关联的数据表 1.1 新建一张表 1.2 执行删除命令 1.3 结果检查 2 删除被其他表关联的主表 2.1 创建两张具有关联关系的表 2.2 执行删除DROP TABLE命令 2.3 取消外键关系,再删除. 定义:   删除数据表就是将数据库中已经存在的表从数据库中删除.注意,在删除表的同时,表的定义和表中所有的数据均会被删除.因此,在进行删除操作前,最好对表中的数据做一个备份,以免造成无法挽回的后果.本节将详细讲解数据库表的删除方法. 1 删除一个

  • Mysql优化order by语句的方法详解

    本篇文章我们将了解ORDER BY语句的优化,在此之前,你需要对索引有基本的了解,不了解的老少爷们可以先看一下我之前写过的索引相关文章.现在让我们开始吧. MySQL中的两种排序方式 1.通过有序索引顺序扫描直接返回有序数据 因为索引的结构是B+树,索引中的数据是按照一定顺序进行排列的,所以在排序查询中如果能利用索引,就能避免额外的排序操作.EXPLAIN分析查询时,Extra显示为Using index. 2.Filesort排序,对返回的数据进行排序 所有不是通过索引直接返回排序结果的操作都

  • MySQL学习之数据库表五大约束详解小白篇

    目录 1.约束概念和分类 2.五大约束的添加和删除 2.1添加约束的六种方法 2.2三种删除约束的方式 2.3五大约束分别对应的添加删除方式(序号对应2.1和2.2) 2.4对于创建约束的总结 2.5对于主键和唯一的区别 3.自增长列 3.1概念 3.2在创建表的时候添加主键约束,并且完成主键自增长的例子 3.3自增长的添加和删除 3.4设置自增长步长 1.约束概念和分类 1.1约束的概念: 对表中的数据进行限定,保证数据的正确性,有效性,完整性 1.2约束分类 1.主键约束(primary k

  • MySQL数据库如何给表设置约束详解

    目录 一.PK(主键约束) 1.什么是主键? 2.怎么设置主键? 二.FK(外键约束) 1.什么是外键 2.怎么设置外键 三.unique(唯一约束) 1.什么是唯一约束? 2.如何设置唯一约束 四.notnull(非空) 五.default(默认值) 六.auto_increment(自增) 一.PK(主键约束) 1.什么是主键? 在了解主键之前,先了解一下什么是关键字 关键字:在表中具有唯一性的字段,比如一个人的身份证号,学号.一个表中可以有多个关键字. 主键也叫主关键字,就是由一个或多个关

  • python FastApi实现数据表迁移流程详解

    目录 啥是数据迁移 1.需要新的数据表 2.需要对现有表结构进行调整 回到ORM 迁移手段 安装alembic 初始化项目 修改alembic.ini 修改alembic/env.py 开始生成迁移工作 变更数据库 FAQ 啥是数据迁移 在我们平时的开发过程中,经常需要对一些数据进行调整.一般会有以下几种场景: 1.需要新的数据表 我们的接口自动化平台虽然已经较为完善了,但难免会继续迭代一些新的功能,假设我们需要做一个订阅用例的功能. 大体想一下就可以知道,订阅用例以后这个数据得持久化(即入库)

  • MySQL数据表基本操作实例详解

    本文实例讲述了MySQL数据表基本操作.分享给大家供大家参考,具体如下: 数据表的基本操作 1.主键约束要求主键列的数据唯一,并且不允许为空.主键能够唯一地识别表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度.主键和记录之间的关系如同身份证和人之间的关系. 2.字表的外键必须关联父表的主键,且关联字段的数据类型必须匹配.如果类型不一样.创建子表时,就会出现错误:ERROR 1005(HY000):can't create table 'databases.ta

  • PHP结合Redis+MySQL实现冷热数据交换应用案例详解

    本文实例讲述了PHP结合Redis+MySQL实现冷热数据交换应用案例.分享给大家供大家参考,具体如下: 场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况 这个场景可以使用redis+mysql冷热数据交换来解决. 何为冷热数据交换? 冷数据:之前使用的数据,热数据:当前使用的数据. 交换:将Redis中的数据周期的存储到MySQL中 业务流程 用户进行投票后,首先将投票数据保存到Redis中,这些数据就是热数据,然

  • MySQL如何对数据进行排序图文详解

    目录 一. 排序的基本使用 二. 使用列的别名来排序 三. 二级排序 总结 一. 排序的基本使用 在查询数据时,如果没有使用排序操作,默认情况下SQL会按元组添加的顺序来排列查询结果. 在SQL中,使用关键字 ORDER BY... 来进行排序操作.在此关键字后面可以添加关键字 ASC (ascend) 表示升序排列 (从小到大) ,DESC (descend) 表示降序排列 (从大到小) . 如果在 ORDER BY... 关键字后没有添加 ASC 或 DESC 来指明升序还是降序排列,SQL

  • django连接mysql数据库及建表操作实例详解

    本文实例讲述了django连接mysql数据库及建表操作.分享给大家供大家参考,具体如下: django连接mysql数据库需要在project同名的目录下面的__init__.py里面加入下面的东西 import pymysql pymysql.install_as_MySQLdb() 找到settIngs里面的database设置如下 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 's22',

随机推荐