【问题标题】:Creating an index in MySQL without creating a temp file on disk在 MySQL 中创建索引而不在磁盘上创建临时文件
【发布时间】:2018-04-01 12:23:14
【问题描述】:

我正在尝试在大型 MySQL 表(每个表 50-100GB)上创建索引。

我注意到,当启动 ALTER 语句以创建新索引时,MySQL 会为该表创建几个临时文件,复制整个表数据(.MYD 文件)和索引(.MYI 文件) 到新文件,可能会相应地修改它们,最后将它们与原始文件交换。这个过程需要很长时间,因为它需要将大量数据复制到这些临时文件中。

假设我不关心锁定表/停机时间/任何其他与生产相关的限制,有没有更快的方法?有没有办法告诉 MySQL,不要创建那些大的临时文件,而是尽可能快地创建索引?

【问题讨论】:

  • 看看ALGORITHM=INPLACE选项

标签: mysql performance sqlperformance database-indexes


【解决方案1】:

.MYD 和 .MYI 文件是 MyISAM 数据文件。如果可以避免,则不应使用 MyISAM 存储引擎。对于大多数查询,它比 InnoDB 慢,MyISAM 有 design defects with respect to data integrity and atomicity。 MyISAM 没有得到改进,正在逐步淘汰。

如果您改用 InnoDB,则可以利用在线 DDL 改进。

CREATE INDEX MyIndex ON MyTable (column1) ALGORITHM=INPLACE;

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

MyISAM 不支持在线 DDL。

【讨论】:

  • 这是一个测试数据库,实际上我没有注意到我在使用 MyISAM,感谢您的出色观察。将接受答案,因为我认为这是最好的答案,尽管 MySQL 5.5 中不存在 ALGORITHM=INPLACE (据我所知,仅在 5.6 中引入)。谢谢!
  • 5.5 中就地 DDL 功能的前身是“快速索引创建”。在这里阅读它:dev.mysql.com/doc/refman/5.5/en/innodb-create-index.html 虽然你真的应该升级到一个更新的版本,因为 MySQL 5.5 是在 2010 年发布的,从那以后产品中添加了许多改进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 2021-05-03
  • 2012-12-24
  • 1970-01-01
相关资源
最近更新 更多