innodb表碎片处理
本次测试环境是 mysql 5.7.23,表空间为每个表单独表空间
mysql> sHOW VARIABLES LIKE 'innodb_file_per_tabl%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)
查看表mysql> show create table ht.tb;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| tb | CREATE TABLE `tb` (
`id` int(11) DEFAULT NULL,
`name` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) mysql> select * from ht.tb limit 3;
+------+---------+
| id | name |
+------+---------+
| 1 | qdds |
| 2 | horizon |
| 3 | beijing |
+------+---------+
3 rows in set (0.36 sec) 构造大表
CREATE PROCEDURE dowhile()
BEGIN
DECLARE v1 INT DEFAULT 10000; WHILE v1 > 0 DO
insert into ht.tb select * from tb;
commit;
SET v1 = v1 - 1;
END WHILE;
END; call dowhile(); 查看表文件大小及行数
mysql> select a.FILE_NAME,a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 from information_schema.FILES a where a.FILE_ID=288;
+-------------+----------------------------------------------+
| FILE_NAME | a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 |
+-------------+----------------------------------------------+
| ./ht/tb.ibd | 1.593750000000 |
+-------------+----------------------------------------------+
1 row in set (0.00 sec) mysql> select count(1) from ht.tb;
+----------+
| count(1) |
+----------+
| 25165824 |
+----------+
1 row in set (27.22 sec)
删除id=2的行
mysql> delete from ht.tb where id=2;
Query OK, 8388608 rows affected (2 min 2.45 sec) mysql> select count(1) from ht.tb;
+----------+
| count(1) |
+----------+
| 16777216 |
+----------+
1 row in set (33.04 sec) mysql> select a.FILE_NAME,a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 from information_schema.FILES a where a.FILE_ID=288;
+-------------+----------------------------------------------+
| FILE_NAME | a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 |
+-------------+----------------------------------------------+
| ./ht/tb.ibd | 1.593750000000 |
+-------------+----------------------------------------------+
1 row in set (0.00 sec)
mysql> select table_schema,table_name,data_free,data_length,index_length,table_rows,CREATE_TIME FROM information_schema.TABLES where TABLE_NAME='tb';
+--------------+------------+-----------+-------------+--------------+------------+---------------------+
| table_schema | table_name | data_free | data_length | index_length | table_rows | CREATE_TIME |
+--------------+------------+-----------+-------------+--------------+------------+---------------------+
| ht | tb | 694157312 | 990904320 | 0 | 16252952 | 2018-08-20 23:51:18 |
+--------------+------------+-----------+-------------+--------------+------------+---------------------+
从上面可知表空间文件大小没变,空间没释放
优化下表在查看
mysql> optimize table ht.tb;
+-------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------+----------+----------+-------------------------------------------------------------------+
| ht.tb | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| ht.tb | optimize | status | OK |
+-------+----------+----------+-------------------------------------------------------------------+
2 rows in set (1 min 29.57 sec) mysql> select table_schema,table_name,data_free,data_length,index_length,table_rows,CREATE_TIME FROM information_schema.TABLES where TABLE_NAME='tb';
+--------------+------------+-----------+-------------+--------------+------------+---------------------+
| table_schema | table_name | data_free | data_length | index_length | table_rows | CREATE_TIME |
+--------------+------------+-----------+-------------+--------------+------------+---------------------+
| ht | tb | 4194304 | 746569728 | 0 | 16739684 | 2018-08-21 00:52:36 |
+--------------+------------+-----------+-------------+--------------+------------+---------------------+
1 row in set (0.00 sec)
mysql> select a.FILE_ID,a.FILE_NAME,a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 from information_schema.FILES a where a.FILE_ID=291;
+---------+-------------+----------------------------------------------+
| FILE_ID | FILE_NAME | a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 |
+---------+-------------+----------------------------------------------+
| 291 | ./ht/tb.ibd | 0.710937500000 |
+---------+-------------+----------------------------------------------+
1 row in set (0.00 sec)
优化以后和预计的表空间大小(删除1/3数据,文件减小1/3)一致;从data_free来看也缩小很多;
optimize table在操作的准备阶段和提交阶段期间短暂地进行独占表锁定,对于InnoDB表,OPTIMIZE TABLE映射到 ALTER TABLE ... FORCE,重建表以更新索引统计信息并释放聚簇索引中未使用的空间;
查询information_schema.FILES 的FILE_ID 和 information_schema.TABLES的CREATE_TIME 可知OPTIMIZE TABLE相当于表删除重建
innodb表碎片处理的更多相关文章
- Mysql Innodb 表碎片整理
一.为什么会产生碎片 简单的说,删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来.于是造成了数据的存储位置不连续,以及物理存储顺序与理论上的排序顺序不同,这种 ...
- MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)
网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是 ...
- MySQL中innodb表主键设计原则
主键设计的原则:1. 一定要显式定义主键2. 采用与业务无关的单独列3. 采用自增列4. 数据类型采用int,并尽可能小,能用tinyint就不用int,能用int就不用bigint5. 将主键放在表 ...
- mysql optimize整理表碎片
当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删 除操作后在数据文件中留下碎片所致.optimize table 可以去除删除操作后留下的数据文件碎片,减小文件尺寸,加快未 ...
- InnoDB表优化
InnoDB表存储优化 适时的使用 OPTIMIZE TABLE 语句来重组表,压缩浪费的表空间.这是在其它优化技术不可用的情况下最直接的方法. OPTIMIZE TABLE 语句通过拷贝表数据并重建 ...
- [MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
首先,介绍下关于InnoDB引擎存储格式的几个要点:1.InnoDB可以选择使用共享表空间或者是独立表空间方式,建议使用独立表空间,便于管理.维护.启用 innodb_file_per_table 选 ...
- MySQL-5.7设置InnoDB表数据文件存储位置
1.表空间 Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间. 共享表空间以及独立表空间都是针对数据的存储方式而言的. 共享表空间: ...
- my30_表碎片整理
确认表的类型与存储引擎,是否全部是innodb select TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE,VERSION,ROW_FORMAT,TABLE_RO ...
- MySQL表碎片整理
MySQL表碎片整理 1. 计算碎片大小 2. 整理碎片 2.1 使用alter table table_name engine = innodb命令进行整理. 2.2 使用pt-online-sch ...
随机推荐
- ondaHTTPError: HTTP 000 CONNECTION FAILED for url
可能是网络问题,换网络. 可能是获取库的IP无法链接到,换库的IP,如添加清华镜像IP等.
- 【转】shell脚本中如何传入参数
(1)直接用$1,$2取传入的参数vim /root/test.sh#!/bin/bashif [ $1 == "start" ] then echo "do ...
- NOIP2001提高组复赛B 数的划分
题目链接:https://ac.nowcoder.com/acm/contest/249/B 题目大意: 略 分析1(记忆化搜索): 方法为减而治之,把n划分成k份的答案就相当于每次把n分成a,b两个 ...
- U盘文件被隐藏
转自https://blog.csdn.net/zichen_ziqi/article/details/80171891 文章原地址:http://www.uqidong.com/help/1625. ...
- ABP项目概述
在系统性介绍整个ABP框架之前,我们首先需要对ABP框架有一个大概的了解,ABP框架的全称是:Asp.Net Boilerplate Project(即Asp.Net 的样板项目)顾名思义就是能够通过 ...
- 操作docker容器
Docker容器时镜像的一个运行实例,而镜像是静态的只读文件,容器带有运行时需要的可写文件层.如果认为虚拟机是模拟运行的一整套操作系统(包括内核.应用运行的环境和其他系统环境)和跑在上面的应用,那么D ...
- Sublime怎么安装Package control组件
Sublime怎么安装Package control组件 藏色散人 藏色散人 2018-11-26 14:30:51 原创 Sorry, your browser does not support e ...
- VS界面控件大小调整
vs2015 ,配置名称显示不全,怎么才能把这个搞宽? 这个问题困扰时间挺长了, 对vs的应用仅限于敲代码.编译, 其他的功能了解甚少, 于是试着在右键菜单中找到了界面自定义窗口, 如下: 找到想要修 ...
- GitHub最基本使用总结
GitHub最基本使用入门 入门必看博客:https://mp.weixin.qq.com/s/LbzSwl4dYwrSPze0w10l8w 一.Git Linux安装 Git Linux安装教程:h ...
- Android Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > Conflict with dependency
错误内容: Error:Execution failed for task ':app:preDebugAndroidTestBuild'.> Conflict with dependency ...