一、为什么会产生碎片

简单的说,删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来.于是造成了数据的存储位置不连续,以及物理存储顺序与理论上的排序顺序不同,这种是数据碎片.实际上数据碎片分为两种,一种是单行数据碎片,另一种是多行数据碎片.前者的意思就是一行数据,被分成N个片段,存储在N个位置.后者的就是多行数据并未按照逻辑上的顺序排列.当有大量的删除和插入操作时,必然会产生很多未使用的空白空间,这些空间就是多出来的额外空间.索引也是文件数据,所以也会产生索引碎片,理由同上,大概就是顺序紊乱的问题.Engine 不同,OPTIMIZE 的操作也不一样的,MyISAM 因为索引和数据是分开的,所以 OPTIMIZE 可以整理数据文件,并重排索引。这样不但会浪费空间,并且查询速度也更慢。

二、Innodb 表碎片整理

1、查看表行数

1)行数

MariaDB [agent_platform]> select count(1) from corporationprofit_old;
+----------+
| count(1) |
+----------+
| 18198196 |
+----------+
1 row in set (54.35 sec)

2)所占磁盘大小

9218180KB

cat test.sh
a=`ls /u02/mysql/data/agent_platform/corporationprofit_old*|xargs  du|awk '{print $1}'`
m=0
for i in $a
do
  echo $i
  ((m=$m+$i))
done
echo $m

3)查看表的信息

MariaDB [(none)]> select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE
    -> from information_schema.TABLES where TABLE_SCHEMA='agent_platform' and TABLE_NAME='corporationprofit_old' limit 1;
+------------+------------+-------------+--------------+-----------------+------------+--------+
| ROW_FORMAT | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | MAX_DATA_LENGTH | DATA_FREE  | ENGINE |
+------------+------------+-------------+--------------+-----------------+------------+--------+
| Compact    |   17105657 |  5187551232 |   2068905984 |               0 | 1101004800 | InnoDB |
+------------+------------+-------------+--------------+-----------------+------------+--------+
1 row in set (0.25 sec)

2、删除部分数据

1)总共删除了8157318行

MariaDB [agent_platform]> delete from corporationprofit_old  where date_created>='2018-10-01' ;
Query OK, 8157318 rows affected (2 min 52.18 sec)

2)查看表的行数

MariaDB [agent_platform]> select count(1) from corporationprofit_old;
+----------+
| count(1) |
+----------+
| 10040878 |
+----------+
1 row in set (11.66 sec)

3)查看表的信息

MariaDB [agent_platform]> select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE
    -> from information_schema.TABLES where TABLE_SCHEMA='agent_platform' and TABLE_NAME='corporationprofit_old' limit 1;
+------------+------------+-------------+--------------+-----------------+------------+--------+
| ROW_FORMAT | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | MAX_DATA_LENGTH | DATA_FREE  | ENGINE |
+------------+------------+-------------+--------------+-----------------+------------+--------+
| Compact    |    9779701 |  5360599040 |   2138177536 |               0 | 4380950528 | InnoDB |
+------------+------------+-------------+--------------+-----------------+------------+--------+
1 row in set (0.30 sec)

4)查看表删除后所占磁盘大小

9218180KB,没有改变

3、表数据碎片整理

1)表数据整理

MariaDB [agent_platform]> OPTIMIZE table corporationprofit_old;
+--------------------------------------+----------+----------+-------------------------------------------------------------------+
| Table                                | Op       | Msg_type | Msg_text                                                          |
+--------------------------------------+----------+----------+-------------------------------------------------------------------+
| agent_platform.corporationprofit_old | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| agent_platform.corporationprofit_old | optimize | status   | OK                                                                |
+--------------------------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (5 min 34.79 sec)

2)查看表信息

MariaDB [agent_platform]> select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE
    -> from information_schema.TABLES where TABLE_SCHEMA='agent_platform' and TABLE_NAME='corporationprofit_old' limit 1;
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| ROW_FORMAT | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | MAX_DATA_LENGTH | DATA_FREE | ENGINE |
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| Compact    |    9863806 |  2996649984 |    854638592 |               0 |   6291456 | InnoDB |
+------------+------------+-------------+--------------+-----------------+-----------+--------+

3)产看整理后所占磁盘大小

3881468KB

碎片整理后,表的大小比之前减少了5GB。

Mysql Innodb 表碎片整理的更多相关文章

  1. MYSQL优化之碎片整理

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

  2. MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)

    网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是 ...

  3. MySQL表碎片整理

    MySQL表碎片整理 1. 计算碎片大小 2. 整理碎片 2.1 使用alter table table_name engine = innodb命令进行整理. 2.2 使用pt-online-sch ...

  4. MySQL InnoDB表--BTree基本数据结构

    MySQL InnoDB表是索引组织表这一点应该是每一个学习MySQL的人都会首先学到的知识,这代表这表中的数据是按照主键顺序存储,也就是说BTree的叶子节点存储了所有该行的数据. 我最开始是搞Or ...

  5. MySQL InnoDB表压缩

    MySQL InnoDB表压缩 文件大小减小(可达50%以上) ==> 查询速度变快(count * 约减少20%以上时间) 如何设置mysql innodb 表的压缩: 第一,mysql的版本 ...

  6. MySQL InnoDB表和索引之聚簇索引与第二索引

    MySQL InnoDB表和索引之聚簇索引与第二索引 By:授客QQ:1033553122 每个InnoDB表都有一个称之为聚簇索引(clustered index)的特殊索引,存储记录行数据.通常, ...

  7. my30_表碎片整理

    确认表的类型与存储引擎,是否全部是innodb select TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE,VERSION,ROW_FORMAT,TABLE_RO ...

  8. innodb表碎片处理

    本次测试环境是 mysql 5.7.23,表空间为每个表单独表空间 mysql> sHOW VARIABLES LIKE 'innodb_file_per_tabl%'; +---------- ...

  9. MySQL innodb表使用表空间物理文件复制或迁移表

    MySQL InnoDB引擎的表通过拷贝物理文件来进行单表或指定表的复制,可以想到多种方式,今天测试其中2种: 将innodb引擎的表修改为Myisam引擎,然后拷贝物理文件 直接拷贝innodb的表 ...

随机推荐

  1. 关于Qt跨线程调用IO子类的理解

    一.疑问 突然想到,类似于QTcpsocket和QSerialport这类对象,如果是在A线程中new的,那就不能在其他线程中访问.我一般是这样做的: 封装一个QObject子类,放这些对象进去,然后 ...

  2. Python3基础 list str转成list

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. Zookeeper一致性协议原理Zab

    ZooKeeper为高可用的一致性协调框架,自然的ZooKeeper也有着一致性算法的实现,ZooKeeper使用的是ZAB协议作为数据一致性的算法, ZAB(ZooKeeper Atomic Bro ...

  4. Wireshark分析RabbitMQ

    消费者Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  5. Maximum GCD (stringstream)题解

    Given the N integers, you have to find the maximum GCD (greatest common divisor) of every possiblepa ...

  6. ubuntu12 root账户自动登录

    Ubuntu为了系统安全,root帐号的密码是随机的,如果临时需要提升至root权限以执行一些命令,需要使用sudo命令.产线上有几台使用Ubuntu的机器,因为使用者不固定,并且执行程序时需要使 用 ...

  7. HDU 5877 Weak Pair(树状数组+dfs+离散化)

    http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意: 给出一棵树,每个顶点都有权值,现在要你找出满足要求的点对(u,v)数,u是v的祖先并且a[u]*a ...

  8. HDU 6073 Matching In Multiplication(拓扑排序+思维)

    http://acm.hdu.edu.cn/showproblem.php?pid=6073 题意:有个二分图,左边和右边的顶点数相同,左边的顶点每个顶点度数为2.现在有个屌丝理解错了最佳完美匹配,它 ...

  9. [ogre]ogre::Animation

    参考:http://blog.csdn.net/leonwei/article/details/5819248 http://blog.csdn.net/debugconsole/article/de ...

  10. .net 获取邮箱邮件列表和内容

    需求: 最近项目里遇到了个问题,对方没有提供直接获取数据源的api接口,而是通过邮件发数据的.这就需要接收邮件后解析邮件内容获得数据. 分析: 想在代码里实时获取邮件,可以通过邮件的几个协议来实现,常 ...