在MySQL中创建索引而不在磁盘上创建临时文件

在MySQL中创建索引而不在磁盘上创建临时文件,mysql,performance,sqlperformance,database-indexes,Mysql,Performance,Sqlperformance,Database Indexes,我试图在大型MySQL表上创建索引(每个表50-100GB) 我注意到,当启动ALTER语句创建新索引时,MySQL为该表创建了几个临时文件,将整个表数据(.MYD文件)和索引(.MYI文件)复制到新文件中,可能会相应地修改它们,最后将它们与原始文件交换。这个过程需要很多时间,因为它需要将大量数据复制到这些临时文件中 假设我不在乎锁定表/停机时间/任何其他与生产相关的限制,有没有更快的方法?有没有办法告诉MySQL,不要创建那些大的临时文件,而是尽可能快地创建索引?这些.MYD和.MYI文件都是

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

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


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

这些.MYD和.MYI文件都是MyISAM数据文件。如果可以避免,则不应使用MyISAM存储引擎。对于大多数查询来说,它比InnoDB慢,MyISAM也有。MyISAM并没有得到改善,而是被逐步淘汰

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

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


MyISAM不支持在线DDL。

请查看一下
ALGORITHM=INPLACE
optionIt是一个测试数据库,实际上我没有注意到我正在使用MyISAM,感谢您的精彩观察。我会接受这个答案,因为我认为这是最好的,尽管MySQL 5.5中不存在算法=INPLACE(据我所知,仅在5.6中介绍)。非常感谢。5.5中的InplaceDDL特性的前身是“快速索引创建”。请在此处阅读:尽管您确实应该升级到更新的版本,因为MySQL 5.5是在2010年发布的,自那时以来,该产品已添加了许多改进。