我有一个有关优化MySQL表的问题,我读了许多有关此功能的文档以及相关的索引数据,以减少存储空间,但是没有人能告诉我优化表并散布问题的原则,我知道这些信息:
- 从MySQL 5.6.17开始,优化表使用在线DDL用于常规和分区的InnodB表
- ,从MySQL 5.6.17开始,该表由优化表触发并在封面下通过Alter Table触发...力已完成(算法= Inplope)
我的问题:
- MySQL的优化表是否真的重建(ReboreAte)表?,因为它已完成(不是算法=复制),是算法= Inplace Real Real Repuild(RepreAte)表?
谢谢您的回复。
https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.html
在此处输入图像描述
演示:
我在MySQL 5.6.37上创建了一个表,并用大约1GB的随机数据填充了它。
mysql> select version();
+-----------------+
| version() |
+-----------------+
| 5.6.37-82.2-log |
+-----------------+
mysql> show table statusG
*************************** 1. row ***************************
Name: mytable
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 61914
Avg_row_length: 20926
Data_length: 1295613952
Max_data_length: 0
Index_length: 1589248
Data_free: 4194304
Auto_increment: 131056
Create_time: 2019-02-20 15:54:23
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_general_ci
Checksum: NULL
Create_options:
Comment:
我可以在我的datadir中观察文件,并记下Inode号码(最左数)。
/usr/local/var/mysql/test ls -li
total 2590752
8625784850 -rw-rw---- 1 bkarwin admin 67 Feb 20 07:54 db.opt
8625784853 -rw-rw---- 1 bkarwin admin 8580 Feb 20 07:54 mytable.frm
8625784854 -rw-rw---- 1 bkarwin admin 1321205760 Feb 20 07:56 mytable.ibd
我运行优化表。
mysql> optimize table mytable;
运行时,我通过再次在datadir中列出文件来检查进度。我看到它创建了一个新的临时文件,并用数据的副本填充了它。
注意临时文件的inode号。
/usr/local/var/mysql/test ls -li
total 4395064
8625785082 -rw-rw---- 1 bkarwin admin 8580 Feb 20 07:57 #sql-337_16.frm
8625785083 -rw-rw---- 1 bkarwin admin 914358272 Feb 20 07:57 #sql-ib2021-3689447301.ibd
8625784850 -rw-rw---- 1 bkarwin admin 67 Feb 20 07:54 db.opt
8625784853 -rw-rw---- 1 bkarwin admin 8580 Feb 20 07:54 mytable.frm
8625784854 -rw-rw---- 1 bkarwin admin 1321205760 Feb 20 07:56 mytable.ibd
最后,我的优化表饰面。花了将近2分钟。如果它没有进行真实的表副本,为什么要花这么长时间?
+--------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------+----------+----------+-------------------------------------------------------------------+
| test.mytable | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.mytable | optimize | status | OK |
+--------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (1 min 5.52 sec)
再次查看datadir,我看到温度文件已重命名为新的表空间,并且已删除了旧文件。新文件具有临时文件的inode编号,表明是副本。
/usr/local/var/mysql/test ls -li
total 2557984
8625784850 -rw-rw---- 1 bkarwin admin 67 Feb 20 07:54 db.opt
8625785082 -rw-rw---- 1 bkarwin admin 8580 Feb 20 07:57 mytable.frm
8625785083 -rw-rw---- 1 bkarwin admin 1304428544 Feb 20 07:58 mytable.ibd