我正在构建一个仅用于阅读的表格,这就是为什么我决定使用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有什么好处?
加载没有索引的所有数据会更快吗?然后再应用一个?
感谢您的意见。
答案 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分钟。