数据库版本mysql 5.7.22
1.测试数据表t1,数据量6188286
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 6188286 |
+----------+
1 row in set (4.98 sec)
2.两次删除188286,5000000
mysql> delete from t1 where 1=1 limit 188286;
Query OK, 188286 rows affected (0.64 sec)
mysql> delete from t1 where 1=1 limit 5000000;
Query OK, 5000000 rows affected (20.27 sec)
3.剩余数据量
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (5.72 sec)
4.查询数据表的情况
mysql> select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE from information_schema.TABLES where TABLE_SCHEMA='dt_data' and TABLE_NAME='t1' limit 1;
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| ROW_FORMAT | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | MAX_DATA_LENGTH | DATA_FREE | ENGINE |
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| Dynamic | 880133 | 602341376 | 0 | 0 | 555745280 | InnoDB |
+------------+------------+-------------+--------------+-----------------+-----------+--------+
1 row in set (0.01 sec)
5.查询系统数据文件大小
# ll -h /var/lib/mysql/dt_data/t1.ibd
-rw-r----- 1 mysql mysql 640M May 25 15:54 /var/lib/mysql/dt_data/t1.ibd
6.执行碎片整理
mysql> OPTIMIZE table t1;
+------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+------------+----------+----------+-------------------------------------------------------------------+
| dt_data.t1 | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| dt_data.t1 | optimize | status | OK |
+------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (4.68 sec)
7.查询数据表情况
mysql> select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE from information_schema.TABLES where TABLE_SCHEMA='dt_data' and TABLE_NAME='t1' limit 1;
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| ROW_FORMAT | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | MAX_DATA_LENGTH | DATA_FREE | ENGINE |
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| Dynamic | 990089 | 114966528 | 0 | 0 | 2097152 | InnoDB |
+------------+------------+-------------+--------------+-----------------+-----------+--------+
1 row in set (0.00 sec)
8.查询系统数据文件情况
# ll -h /var/lib/mysql/dt_data/t1.ibd
-rw-r----- 1 mysql mysql 116M May 25 16:02 /var/lib/mysql/dt_data/t1.ibd
9.继续,查询数据量
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (0.48 sec)
10.删除数据500000
mysql> delete from t1 where 1=1 limit 500000;
Query OK, 500000 rows affected (1.42 sec)
11.查询数据量
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 500000 |
+----------+
1 row in set (0.29 sec)
12.查询数据表情况
mysql> select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE from information_schema.TABLES where TABLE_SCHEMA='dt_data' and TABLE_NAME='t1' limit 1;
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| ROW_FORMAT | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | MAX_DATA_LENGTH | DATA_FREE | ENGINE |
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| Dynamic | 491420 | 64061440 | 0 | 0 | 52428800 | InnoDB |
+------------+------------+-------------+--------------+-----------------+-----------+--------+
1 row in set (0.01 sec)
13.查询系统数据文件情况
# ll -h /var/lib/mysql/dt_data/t1.ibd
-rw-r----- 1 mysql mysql 116M May 25 16:22 /var/lib/mysql/dt_data/t1.ibd
14.执行碎片整理
mysql> OPTIMIZE table t1;
+------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+------------+----------+----------+-------------------------------------------------------------------+
| dt_data.t1 | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| dt_data.t1 | optimize | status | OK |
+------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (2.87 sec)
15.查询数据表情况
mysql> select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE from information_schema.TABLES where TABLE_SCHEMA='dt_data' and TABLE_NAME='t1' limit 1;
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| ROW_FORMAT | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | MAX_DATA_LENGTH | DATA_FREE | ENGINE |
+------------+------------+-------------+--------------+-----------------+-----------+--------+
| Dynamic | 497810 | 56180736 | 0 | 0 | 3145728 | InnoDB |
+------------+------------+-------------+--------------+-----------------+-----------+--------+
1 row in set (0.00 sec)
16.查询系统数据文件情况
# ll -h /var/lib/mysql/dt_data/t1.ibd
-rw-r----- 1 mysql mysql 60M May 25 16:27 /var/lib/mysql/dt_data/t1.ibd
总结:由于是innodb引擎,所以试验没有MySIAM引擎试验顺利,TABLE_ROWS每次删完数据,变化大概按数据量来,但是整理之后变化没有规律,不知道按什么来的。DATA_LENGTH会有所变化,整理前后变化情况按照DATA_FREE来,可能innodb引擎的原因,DATA_FREE不会降到0.总结纯属个人见解,有问题指正就好,不要喷我。