記錄一次使用innodb引擎的mysql數據表的碎片整理

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章