數據庫版本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.總結純屬個人見解,有問題指正就好,不要噴我。