在 MySQL 中,在数据加载之前或之后创建索引更快吗?

在 MySQL 中,在数据加载之前或之后创建索引更快吗?

我有一个数据复制过程,它会删除并重新创建目标数据库中的几个表,然后使用源数据库中的数据加载它们(在另一台主机上运行,​​但这与当前的问题无关)。

目标数据库确实需要主键和表上的一些其他索引,但在数据加载期间不需要。我目前正在加载所有数据,然后创建索引。但是,索引创建需要相当长的时间——我的数据加载器运行了 5 个半小时,其中 30 分钟就用完了。

我的直觉告诉我,最后创建索引应该比先创建索引更快,因为每次插入时都需要重写索引。

有人能确切地告诉我哪种方式更快吗?FWIW,我正在运行带有 InnoDB 表的 MySQL 5.1。

答案1

据我所知,你的直觉是正确的。桌子有序吗?http://kevin.vanzonneveld.net/techblog/article/improve_mysql_insert_performance/对优化批量插入有一些建议。

答案2

还有一些事情需要考虑。

对于所有 MyISAM 表,最好通过禁用非唯一索引来批量加载

更改表 myisamtabletoload 禁用键;
插入 myisamtabletoload ...;
更改表 myisamtabletoload 启用键;

主键和唯一键在插入过程中全部填充并排序。

一旦执行 ENABLE KEYS,所有非唯一索引都通过排序建立。

不幸的是,由于 InnoDB 内部存在聚集键结构,DISABLE KEYS 和 ENABLE KEYS 不适用于 InnoDB。

相关内容