mysql> show create table ta\g
*************************** 1. row ***************************
table: ta
create table: create table `ta` (
`id` int(11) not null,
`ia` int(11) not null,
primary key (`id`)
) engine=innodb default charset=utf8
1 row in set (0.00 sec)
使用下面的存储过程,向 ta 中批量插入数据
delimiter //
create procedure multinsert(in beg int,in cnt int)
begin
declare icnt int default 0;
declare tmp int default 0;
while icnt < cnt do
set icnt = icnt + 1;
set tmp = beg + icnt;
insert into ta(id,ia) values(tmp,tmp);
end while;
end//
delimiter ;
mysql> delete from ta where id between 1 and 50000;
query ok, 10000 rows affected (0.03 sec)
mysql> select count(*) from ta;
+----------+
| count(*) |
+----------+
| 50000 |
+----------+
1 row in set (0.02 sec)
删除操作完成之后,再次查看磁盘上 ta.ibd 的大小
[root@ecs-centos-7 test]# cd /var/lib/mysql/test/
[root@ecs-centos-7 test]# ls -l ta.ibd
-rw-r----- 1 mysql mysql 11534336 1月 3 23:14 ta.ibd
更新数据可以看成先删除再插入,也是有可能造成数据空洞
比如: id 是表 ta的主键, update ta set id = 10 where id = 1 语句把 id = 1 修改为 id = 10,相当于先删除 id = 1 的记录,再插入 id = 10 的记录,这种情况是会产生数据空洞的
但是如果是类似 update ta set ia = ia + 1 where id = 1 这种没有更改主键值的语句是不会造成空洞的
所以,更新数据可能会造成数据空洞
总结下来就是,表的增删改操作,可能会造成数据空洞的,而线上的服务会对表进行大量的增删改操作,数据空洞存在的可能性比较大