MySQL 清除表空间碎片

碎片产生的原因

(1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白、被留空,而在一段时间内的大量删除操作,

会使这种留空的空间变得比存储列表内容所使用的空间更大;

(2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片;

(3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分;

例如:
一个表有1万行,每行10字节,会占用10万字节存储空间,执行删除操作,只留一行,实际内容只剩下10字节,但MySQL在读取时,

仍看做是10万字节的表进行处理,所以,碎片越多,就会越来越影响查询性能。

查看表碎片大小

(1)查看某个表的碎片大小

mysql> SHOW TABLE STATUS LIKE ‘表名‘;
  • 1

结果中’Data_free’列的值就是碎片大小

(2)列出所有已经产生碎片的表

mysql> select table_schema db, table_name, data_free, engine
from information_schema.tables
where table_schema not in (‘information_schema‘, ‘mysql‘)  and data_free > 0;
  • 1
  • 2
  • 3

清除表碎片

(1)MyISAM表

mysql> optimize table 表名
  • 1

(2)InnoDB表

mysql> alter table 表名 engine=InnoDB
  • 1

Engine不同,OPTIMIZE 的操作也不一样的,MyISAM 因为索引和数据是分开的,所以 OPTIMIZE 可以整理数据文件,并重排索引.

OPTIMIZE 操作会暂时锁住表,而且数据量越大,耗费的时间也越长,它毕竟不是简单查询操作.所以把 Optimize 命令放在程序中是不妥当的,

不管设置的命中率多低,当访问量增大的时候,整体命中率也会上升,这样肯定会对程序的运行效率造成很大影响.比较好的方式就是 做个shell,

定期检查mysql中information_schema.TABLES字段,查看 DATA_FREE 字段,大于0话,就表示有碎片.

时间: 2024-10-03 21:26:37

MySQL 清除表空间碎片的相关文章

mysql共享表空间和独立表空间

innodb表的数据结构 innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等. 对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 什么是共享表空间和独占表空间 共享表空间以及独占表空间都是针对数据的存储方式而言的. 共享表空间:  某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下. 默认的文件名为:ibdata1  初始化为10M. 独占表空间:  每一个表都将会生成以独立的文件方式

Oracle 数据库表空间碎片查询和整理

dba_free_space 显示的是有free 空间的tablespace ,如果一个tablespace 的free 空间不连续,那每段free空间都会在dba_free_space中存在一条记录.如果一个tablespace 有好几条记录,说明表空间存在碎片,当采用字典管理的表空间碎片超过500就需要对表空间进行碎片整理. select a.tablespace_name ,count(1) 碎片量 from dba_free_space a, dba_tablespaces b wher

MySQL数据库表空间及索引的查看

本文我们介绍MySQL数据库表空间和索引的查看方法,并详细地给出了其代码,接下来我们一一介绍. 1.查看索引 (1)单位是GB SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024*1024), 2), ' GB') AS 'Total Index Size' +------------------+ | Total Index Size | +------------------+ | 1.70 GB | +------------------+ (

浅析mysql 共享表空间与独享表空间以及他们之间的转化

innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间.什么是共享表空间和独占表空间共享表空间以及独占表空间都是针对数据的存储方式而言的.共享表空间:  某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下. 默认的文件名为:ibdata1  初始化为10M.独占表空间:  每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm

mysql共享表空间转独立表空间

使用innodb_export_import.py脚本: https://github.com/thecpaneladmin/innodb-tools 安装MySQL-python模块: shell > yum install MySQL-python -y 步骤一:修改my.cnf文件 增加innodb_force_recovery = 4参数,重启mysql,阻塞所有读写操作, 步骤二:执行脚本导出innodb表的数据(脚本没有用户和密码选项,需要写在my.cnf文件中,即user=xxx和

mysql 共享表空间的扩展

innodb表空间的扩展: 在配置共享表空间的情况下,mysql数据目录下会有一个文件ibdata1,而且随着数据的增多,持续增加, 数据库的删除操作并不会缩减ibdata1的容量. 这是由于my.cnf的配置: innodb_data_file_path = ibdata1:10M:autoextend 配置说明,innodb共享表空间文件是ibdata1,并且初始设置10M空间,当表空间不足时自动扩张 这样就会导致一个问题,当越来越多的数据增加的时候,ibdata也会持续膨胀,有的达到几十G

表空间碎片化一二

最近遇到一个问题,有人说表空间的自动扩展会带来碎片化,我觉得这是一个误区,有必要说说. 1.什么时候开始出现碎片化?表空间是一个逻辑的概念,为数据库提供使用空间的逻辑结构,其对应物理结构是数据文件,一个表空间可以包含多个数据文件.表空间存放的是段(segment).而段是数据库一种逻辑结构,包括表段,索引段,回滚段等,段存在于表空间中,并对应一定的存储空间. 那什么时候开始出现碎片化呢?所有的Oracle段(为了理解方便,后面把segment作为表的一个同义词)都有一个在段内容纳数据的上限,我们

mysql释放表空间

公司用的阿里云的RDS数据库 经常磁盘空间超过80% 后来发现有一个表message数据就30万,却占用了65G空间,非常不正常. 后来发现有一个命令,可以释放表空间. 命令如下 optimize table message; 等了几分钟执行完了,表空间占用了680M 磁盘空间就下降到11% 太有效果了. 这个表数据写的非常频繁,但是每隔一个小时会将数据转移到另外一个表. 所以最好每天释放一下,我就写了一个脚本. message_release.sh *部分是机密,内容如下: #!/bin/ba

mysql之 表空间传输

说明:MySQL(5.6.6及以上),innodb_file_per_table开启. 1.1. 操作步骤: 0. 目标服务器创建相同表结构1. 目的服务器: ALTER TABLE t DISCARD TABLESPACE;2. 源服务器 : FLUSH TABLES t FOR EXPORT;3. 从源服务器上 拷贝t.ibd, t.cfg文件到目的服务器4. 源服务器: UNLOCK TABLES;5. 目的服务器: ALTER TABLE t IMPORT TABLESPACE; 1.2