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

我有一个大的MyISAM表(〜30M行)。 在某些时候,我已经把它切换到了固定的行格式,所以现在表格在磁盘上占用了40Gb,在索引上占用了2Gb。 表有一个唯一的索引,每秒有100个“插入重复键更新”查询。 随着表的增长,这些插入变得越来越慢。

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

首先,并发写入绝对不是MyISAM存储的一个选项。 他们每个人都会locking整个表格(除了在某些情况下阅读)。 如果InnoDB不适合你,试试TokuDB。 但是由于TokuDB(当然还有InnoDB)引擎的事务性质(至less要写两次相同的数据:日志和数据文件),与MyISAM相比,它会变慢。 此外,如果您的服务器有一天会崩溃,您将等待几个小时,直到您的40Gb MyISAM表修复。

如果你仍然想要将数据加载到你的MyISAM表中并且希望快速完成,我可以推荐使用LOAD DATA INFILE而不是插入。 这是将大量数据加载到表的最快方法。 是的,索引会以指数的方式减慢插入性能。

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

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