Mysql Innodb 表碎片整理
一、为什么会产生碎片
简单的说,删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来.于是造成了数据的存储位置不连续,以及物理存储顺序与理论上的排序顺序不同,这种是数据碎片.实际上数据碎片分为两种,一种是单行数据碎片,另一种是多行数据碎片.前者的意思就是一行数据,被分成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 表碎片整理的更多相关文章
- MYSQL优化之碎片整理
MYSQL优化之碎片整理 在MySQL中,我们经常会使用VARCHAR.TEXT.BLOB等可变长度的文本数据类型.不过,当我们使用这些数据类型之后,我们就不得不做一些额外的工作--MySQL数据 ...
- MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)
网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是 ...
- MySQL表碎片整理
MySQL表碎片整理 1. 计算碎片大小 2. 整理碎片 2.1 使用alter table table_name engine = innodb命令进行整理. 2.2 使用pt-online-sch ...
- MySQL InnoDB表--BTree基本数据结构
MySQL InnoDB表是索引组织表这一点应该是每一个学习MySQL的人都会首先学到的知识,这代表这表中的数据是按照主键顺序存储,也就是说BTree的叶子节点存储了所有该行的数据. 我最开始是搞Or ...
- MySQL InnoDB表压缩
MySQL InnoDB表压缩 文件大小减小(可达50%以上) ==> 查询速度变快(count * 约减少20%以上时间) 如何设置mysql innodb 表的压缩: 第一,mysql的版本 ...
- MySQL InnoDB表和索引之聚簇索引与第二索引
MySQL InnoDB表和索引之聚簇索引与第二索引 By:授客QQ:1033553122 每个InnoDB表都有一个称之为聚簇索引(clustered index)的特殊索引,存储记录行数据.通常, ...
- my30_表碎片整理
确认表的类型与存储引擎,是否全部是innodb select TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE,VERSION,ROW_FORMAT,TABLE_RO ...
- innodb表碎片处理
本次测试环境是 mysql 5.7.23,表空间为每个表单独表空间 mysql> sHOW VARIABLES LIKE 'innodb_file_per_tabl%'; +---------- ...
- MySQL innodb表使用表空间物理文件复制或迁移表
MySQL InnoDB引擎的表通过拷贝物理文件来进行单表或指定表的复制,可以想到多种方式,今天测试其中2种: 将innodb引擎的表修改为Myisam引擎,然后拷贝物理文件 直接拷贝innodb的表 ...
随机推荐
- github客户端上传代码
在window下安装github客户端上传代码 第一步:创建Github新账户 第二步:新建仓库 第三步:安装Github shell程序,地址:http://windows.github.com/ ...
- Sql 最简单的Sqlserver连接
string name = txtUserName.Text.Trim();//移除用户名前部和后部的空格 string pwd = txtUserPwd.Text.Trim();//移除密码前部和后 ...
- 【Coursera】Third Week(1)
The Early World-Wide-Web 关于CERN 欧洲核子研究组织,除了它为世界物理学所作出的卓越贡献,它还是世界上第一个网站,第一个网络服务器,第一个浏览器的诞生地. Robert C ...
- 网页图片提取助手(支持背景图、选择dom范围)
网页图片提取助手(支持背景图.选择dom范围) 网页图片下载工具.网页图片批量保存. 使用场景: 作为web前端开发首——学习小生的你我,仿学在线页面是常有的事,但是一些在线资源,比如图片,图片有im ...
- python 写文件刷新缓存
搞爬虫的时候,结果是通过file.write(strs)写入文件的. 带来的问题是,进程如果是被杀死的时候,最后一条结果总是缺损的,因为缓存的部分还未写入文件. 解决办法是每次写入文件时,都刷新缓存, ...
- NOI 8467 鸣人的影分身
http://noi.openjudge.cn/ch0206/8467/ 描述 在火影忍者的世界里,令敌人捉摸不透是非常关键的.我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例 ...
- Linux 普通用户拿到root权限及使用szrz命令上传下载文件
1.如何拿到root权限 在shell里如果看到你的命令输入行最前面显示的是 $符号,说明目前账号只有系统的普通权限. 输入:sudo su 这时能看到shell的输入行最前面已经显示的是#号,说明已 ...
- python 函数返回函数
def hi(name="yasoob"): def greet(): return "now you are in the greet() function" ...
- nohup 与 &
&的意思是在后台运行, 什么意思呢? 意思是说, 当你在执行 ./a.out & 的时候, 即使你用ctrl C, 那么a.out照样运行(因为对SIGINT信号免疫). 但是要注 ...
- shell 字符串提取数字
echo "2014年7月21日" | tr -cd "[0-9]" 这样就可以提取出2014721