我有一个数据复制过程,它会删除并重新创建目标数据库中的几个表,然后使用源数据库中的数据加载它们(在另一台主机上运行,但这与当前的问题无关)。
目标数据库确实需要主键和表上的一些其他索引,但在数据加载期间不需要。我目前正在加载所有数据,然后创建索引。但是,索引创建需要相当长的时间——我的数据加载器运行了 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。