记录一次使用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.总结纯属个人见解,有问题指正就好,不要喷我。

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