mysql - 在不在磁盘上创建临时文件的情况下在 MySQL 中创建索引

标签 mysql performance sqlperformance database-indexes

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

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

假设我不关心锁定表/停机时间/任何其他与生产相关的限制,有没有更快的方法?有没有办法告诉 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 - 在不在磁盘上创建临时文件的情况下在 MySQL 中创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49598010/

相关文章:

php - mysql 和 PHP 中两个日期之间的差异

mysql - 是否可以在聚合上使用子查询 IN 子句?

PHP fatal error : Call to a member function bind_param() on a non-object (PHP-MySQL PreparedStatement)

mysql - 根据 2 个不同的表条件替换数据库字段

performance - Perl 速度 : difference between $a = $a. $b 和 $a .= $b

mysql - 为什么这个 "Mysql"查询偶尔会挂起一次?

mysql - FInd_IN_SET vs IN子句MYSQL存储过程的使用

c - 在分段筛中将 int 更改为 unsigned long long 时性能大幅下降

performance - seq 和向量之间转换的性能成本是多少?

mysql - 分解大型 SQL 命令/性能 (MySQL)