OPTIMIZE TABLE 对我的数据有什么影响吗?

Mat*_*zen 9 mysql innodb myisam optimization

我的数据库速度变慢了。phpMyAdmin 中的分析器建议我OPTIMIZE TABLE在我的表上运行。

但在这样做之前,我(当然)想知道表中的数据是否会发生任何事情,或者此操作是否完全无害。

使用时我应该考虑利弊OPTIMIZE TABLE吗?索引和主键会保持不变吗?数据库中是否有优化后会变慢的区域?

Rol*_*DBA 15

优化表基本上做了三(3)件事

  1. 缩小数据页
  2. 缩小索引页
  3. 计算新索引统计信息

从概念上讲,OPTIMIZE TABLEmydb.mytable

USE mydb
CREATE TABLE mytabletmp LIKE mytable;
INSERT INTO mytabletmp SELECT * FROM mytable;
ALTER TABLE mytable RENAME mytablezap;
ALTER TABLE mytabletmp RENAME mytable;
DROP TABLE mytablezap;
ANALYZE TABLE mytable;
Run Code Online (Sandbox Code Playgroud)

然而,基于

  • 桌子 mydb.mytable
  • 数据目录是 /var/lib/mysql

让我们看看存储引擎细节

我的ISAM

MyISAM 表mydb.mytable物理上存储在三个文件中

  • /var/lib/mysql/mydb/mytable.frm (表结构)
  • /var/lib/mysql/mydb/mytable.MYD (数据)
  • /var/lib/mysql/mydb/mytable.MYI (索引)

运行 OPTIMIZE TABLE 的概念描述会将数据页和索引页复制到一个新的.MYD.MYI. 这将消除在任一文件中存在碎片页面的情况。

数据库

有两个观点需要考虑

观点#1:禁用innodb_file_per_table

随着innodb_file_per_table残疾人,为每个InnoDB表的所有数据页和索引页都存储在系统表空间(一般称为文件ibdata1中)内。

当您OPTIMIZE TABLE在存储在 ibdata1 中的 InnoDB 表上运行时,所有数据和索引页都是连续写入的,因此该表的所有页都在一起。坏消息是它使ibdata1快速增长。

观点#2:启用innodb_file_per_table

随着innodb_file_per_table启用后,每个InnoDB表的所有数据页和索引页存储之外ibdata1中。这是物理存储mydb.mytable

  • /var/lib/mysql/mydb/mytable.frm (表结构)
  • /var/lib/mysql/mydb/mytable.ibd (数据和索引)

当您OPTIMIZE TABLE在存储在 ibdata1(系统表空间)之外的 InnoDB 表上运行时,这将执行导致缩小.ibd文件的概念性步骤。

我以前写过这个

现在,对于您最初的问题...

但在这样做之前,我(当然)想知道表中的数据是否会发生任何事情,或者此操作是否完全无害。

我刚刚解释了 OPTIMIZE TABLE 如何为两个存储引擎工作。这可能很耗时,具体取决于数据和索引的大小。在地震或停电之外,运行 OPTIMIZE TABLE 不会损害数据并且索引得到重建。

使用 OPTIMIZE TABLE 时我应该考虑利弊吗?

同上

索引和主键会保持不变吗?

是的

数据库中是否有优化后会变慢的区域?

没门。查询没有碎片的表只会更快


归档时间:

查看次数:

20625 次

最近记录:

8 年 前