0

我正在构建一个用于只读的表,这就是为什么我决定使用 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 有什么好处吗?

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

感谢您的输入。

4

2 回答 2

1

赶紧跑:

ALTER TABLE `name` DISABLE KEYS;

... do your query ...

ALTER TABLE `name` ENABLE KEYS;

是的,每个插入还需要插入到与表关联的每个索引中。所以索引比较慢。

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

于 2012-09-28T00:57:06.947 回答
1

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

更改 myisam_sort_buffer_size 值的速度会非常快。对我来说,我看到导入需要几个小时,下降到大约 20 分钟。

于 2012-09-28T01:20:29.167 回答