我有一个数据复制过程,在目标数据库中删除并重新创build一些表格,然后从源数据库(运行在另一个主机上,但对手头的问题无关紧要)加载数据。
目标数据库在其表上确实需要主键和其他一些索引,但在数据加载期间不需要。 我目前正在加载所有的数据,然后创build索引。 但是,创build索引需要相当长的时间 – 我的数据加载器需要30分钟,运行时间为5个半小时。
我的直觉告诉我,在最后创build索引应该比首先创build索引要快,因为索引需要用每个插入重写。
谁能告诉我哪个方法更快? FWIW,我用InnoDB表运行MySQL 5.1。
你的直觉是正确的AFAIK。 桌子是订购的吗? http://kevin.vanzonneveld.net/techblog/article/improve_mysql_insert_performance/有一些优化批量插入的build议。
这是别的想法。
对于所有MyISAM表,最好通过禁用非唯一索引来批量加载
ALTER TABLE myisamtabletoload DISABLE KEYS;
INSERT INTO myisamtabletoload …;
ALTER TABLE myisamtabletoload ENABLE KEYS;
主键和唯一键在插入期间全部填充和sorting。
一旦ENABLE KEYS被执行,所有非唯一索引都是通过Sorting构build的。
不幸的是,DISABLE KEYS和ENABLE KEYS不能用于InnoDB,因为它的引擎是集群的关键结构。