使用唯一密钥加快MyISAM上分区的MySQL插入


9

我有一个很大的MyISAM表(约3000万行)。在某些时候,我已经将其切换为固定行格式,因此现在表在磁盘上需要约40Gb,而索引需要2Gb。该表具有唯一索引,每秒有100个“在重复键更新上插入”查询。随着表的增长,这些插入变得越来越慢。

我不确定,但是分区会帮助我加快插入速度吗?

Answers:


1

首先,并发写入绝对不是MyISAM存储的选项。它们每个都将锁定整个表(在某些情况下除外)。如果InnoDB不适合您,请尝试使用TokuDB。但由于TokuDB(当然还有InnoDB)引擎的事务性质,与MyISAM相比,它会更慢(您应该至少写入两次相同的数据:日志和数据文件)。另外,如果您的服务器有一天会崩溃,则您将等待几个小时,直到40Gb MyISAM表修复为止。

如果您仍然想将数据加载到MyISAM表中并希望快速完成,我建议您使用LOAD DATA INFILE而不是插入。这是将大量数据加载到表中的最快方法。是的,索引将以指数方式降低插入性能。

关于分区的一句话:MySQL中的INSERT语句不支持修剪,因此将在每个语句上扫描所有分区以进行唯一索引匹配。同样,所有分区都将被锁定,直到插入结束。



0

这些插入查询是并发的还是源自同一过程?如果它们是并发的,则最好为此表使用InnoDB存储,因为MyISAM锁定整个表,而InnoDB利用行锁。如果不能切换到其他存储,则可以尝试INSERT DELAYED语句和许多其他插入优化。除非您将不同的分区放在不同的物理磁盘上,否则分区将无济于事。


这些插入是并发的。但是,InnoDB在“插入重复密钥更新中插入”的速度太慢,因此不是一种选择。据我所知,IO不是瓶颈-RAM数量>>表的大小(包括索引和writecaching)已启用。我认为问题出在内部mysql锁之类的地方。
2011年

INSERT DELAYED仅应用于指定值列表的INSERT语句。对于INSERT ... SELECT或INSERT ... ON DUPLICATE KEY UPDATE语句,服务器将忽略DELAYED。
llazzaro 2011年

“ InnoDB太慢”-您是否尝试过对其进行调整?默认设置很差。
rvs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.