分区是否会提高MySQL的插入速度?

9

我在使用MySQL 5.0通过LOAD DATA INFILE进行大量的INSERT操作。 在进行许多插入操作之后,比如几亿行(InnoDB,PK +非唯一索引,64位Linux 4GB RAM,RAID 1),插入操作明显变慢,并且出现了IO限制。 如果将数据流向单独的分区表中,MySQL 5.1中的分区是否有可能提高性能?


这确实是很多行。你使用的是哪个表引擎?MyISAM 还是 InnoDB? - Asaph
这个表上有没有索引(因为它们会减慢插入速度)? - Asaph
什么操作系统?什么文件系统?该计算机有多少内存? - Asaph
1
Asaph回答了你所有的问题,但你没有给他任何建议。太棒了! - Jay Taylor
4个回答

4
前面的答案在假设分区会降低性能方面是错误的,事实恰恰相反。
这是一篇冗长但信息丰富的文章,介绍了在MySQL中进行分区的原因和方法:http://dev.mysql.com/tech-resources/articles/partitioning.html 通常情况下,分区被用来将类似的数据分组在一起。这样,当你决定归档或彻底删除一个分区时,你的表不会变得碎片化。然而,这并不会影响性能,实际上它可以提高性能。因为不仅删除操作会导致数据碎片化,更新和插入操作也可能会导致碎片化。通过对数据进行分区,您可以指示RDBMS根据特定的标准(索引)来操作和查询数据。

嗨@Wayne,我也在尝试进行一些分区。我是否需要先删除索引,然后再进行表分区? - Heril Muratovic

1

编辑: SiLent SoNG说得对。DISABLE / ENABLE KEYS仅适用于MyISAM,而不适用于InnoDB。 我以前不知道,但我去看了文档。 http://dev.mysql.com/doc/refman/5.1/en/alter-table.html#id1101502

更新任何索引可能会使其变慢。您可以在进行更新时禁用索引,然后重新启用它们,以便整个表格只生成一次。

ALTER TABLE foo DISABLE KEYS;
LOAD DATA INFILE ... ;
ALTER TABLE ENABLE KEYS;

这将导致所有索引一次性全部更新,而不是每行都更新。 这也会导致更平衡的BTREE索引。


1
提问者已经提到了InnoDb。禁用键和启用键不支持InnoDb。 - SiLent SoNG
@SiLent SoNG:感谢你的回复,我之前不知道只有MyISAM支持这个功能。我已经修改了帖子。 - Slashterix

0

-5
如果插入检查的列(例如主键)已经建立索引,则这只会降低速度:MySQL还必须决定分区。
通过添加索引来改善所有查询。当您拥有大量非常旧的数据(例如年份<2000),并且很少使用时,分区是有用的:然后可以为该数据创建一个分区。
干杯!

所有查询的性能都不受索引的帮助:插入操作的性能会受到索引的影响。 - nicolaskruchten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接