在 MySQL 中创建索引而不在磁盘上创建临时文件
Creating an index in MySQL without creating a temp file on disk
我正在尝试在大型 MySQL table 上创建索引(每个 table 50-100GB)。
我注意到当启动 ALTER 语句以创建新索引时,MySQL 为该 table 创建了几个临时文件,复制了整个 table 数据(.MYD 文件)和索引(.MYI 文件)到新文件,可能会相应地修改它们,最后将它们与原始文件交换。这个过程需要很多时间,因为它需要将大量数据复制到这些临时文件中。
假设我不关心锁定 table/停机时间/任何其他与生产相关的限制,有没有更快的方法?有没有办法告诉 MySQL,不要创建那些大的临时文件,而是尽可能快地创建索引?
.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。
我正在尝试在大型 MySQL table 上创建索引(每个 table 50-100GB)。
我注意到当启动 ALTER 语句以创建新索引时,MySQL 为该 table 创建了几个临时文件,复制了整个 table 数据(.MYD 文件)和索引(.MYI 文件)到新文件,可能会相应地修改它们,最后将它们与原始文件交换。这个过程需要很多时间,因为它需要将大量数据复制到这些临时文件中。
假设我不关心锁定 table/停机时间/任何其他与生产相关的限制,有没有更快的方法?有没有办法告诉 MySQL,不要创建那些大的临时文件,而是尽可能快地创建索引?
.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。