MyISAM索引使用LOAD DATA INFILE减慢速度

时间:2012-09-28 00:48:33

标签: mysql innodb myisam

我正在构建一个仅用于阅读的表格,这就是为什么我决定使用MyISAM代替InnoDB(但我可以接受建议)。但是,这个表需要非常大。虽然每行大约12-14个字节,但表本身将包含数亿到数十亿行。

表格如下:

CREATE TABLE `tb1` ( `wid` int(11) NOT NULL DEFAULT '0',
`pid` int(11) NOT NULL DEFAULT '0',
`hit` tinyint(3) unsigned NOT NULL DEFAULT '0',
KEY `wid` (`wid`,`hit`,`pid`))
ENGINE=MyISAM DEFAULT CHARSET=latin1

我正在使用块中的LOAD DATA LOCAL INFILE从文本文件加载所有数据。

加载大约20M行需要30秒。然后我加载一个100M行的块,10分钟后,取消查询后,总共只有38M行。 (10分钟内18M行?..)

看来这种类型的加载是指数而不是线性的。那是为什么?

当索引持续增加时,如何加快LOAD DATA INFILE的速度?

在LOAD DATA INFILE速度方面使用InnoDB而不是MyISAM有什么好处?

加载没有索引的所有数据会更快吗?然后再应用一个?

感谢您的意见。

2 个答案:

答案 0 :(得分:1)

跑步:

ALTER TABLE `name` DISABLE KEYS;

... do your query ...

ALTER TABLE `name` ENABLE KEYS;

是的,每个插入都需要插入与表关联的每个索引。因此索引速度较慢。

另请注意,您可以在MyISAM上使用INSERT DELAYED

答案 1 :(得分:1)

减速是索引。您可以使用禁用键技巧,这将更快地导入数据,但启用键步骤仍将需要很长时间。您真正想要做的是在导入数据时最大化myisam_sort_buffer_size。您可以为此分配的内存越多,MySQL需要更少的磁盘进行排序和更新索引。您仍然可以使用禁用键技巧,您可以在导入完成后降低值。

更改myisam_sort_buffer_size值的速度可能非常快。对我来说,我看到进口花了几个小时,下降到大约20分钟。