首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql的优化表真的重建(重新创建)表吗?

mysql的优化表真的重建(重新创建)表吗?
EN

Stack Overflow用户
提问于 2019-02-20 15:32:55
回答 1查看 1.6K关注 0票数 5

我有一个关于mysql优化表的问题,我读过许多关于这个函数的文档,所有的文档都说:它可以对InnoDB表进行整理,并重新组织表数据和相关索引数据的物理存储,以减少存储空间,但是没有人能告诉我优化表和解决问题的原理,我知道这些信息:

  1. 从MySQL 5.6.17开始,优化表对常规和分区的InnoDB表使用联机DDL
  2. ,在MySQL 5.6.17中,表重建由优化表触发,并在ALTER的掩护下执行。作用力到位(算法=内)

我的问题:

  1. mysql的优化表真的重建(重新创建)表吗?因为它已经完成(而不是ALGORITHM=copy),所以ALGORITHM=inplace是真正的重建(重新创建)表吗?

谢谢你的回应。

https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.html

在这里输入图像描述

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-20 16:04:23

演示:

我在MySQL 5.6.37上创建了一个表,并填充了大约1GB的随机数据。

代码语言:javascript
复制
mysql> select version();
+-----------------+
| version()       |
+-----------------+
| 5.6.37-82.2-log |
+-----------------+

mysql> show table status\G
*************************** 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编号(最左边的数字)。

代码语言:javascript
复制
/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

我运行优化表。

代码语言:javascript
复制
mysql> optimize table mytable;

当它运行时,我再次在datadir中列出文件来检查进度。我看到它创建了一个新的临时文件,它正在用数据的副本填充它。

注意临时文件的inode编号。

代码语言:javascript
复制
/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

最后,我的优化表完成了。差不多花了两分钟。如果它没有做一个真正的表副本,为什么要花这么长时间?

代码语言:javascript
复制
+--------------+----------+----------+-------------------------------------------------------------------+
| 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编号,表示它是副本。

代码语言:javascript
复制
/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
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54789901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档