使用唯一键加速 MyISAM 分区的 MySQL 插入

使用唯一键加速 MyISAM 分区的 MySQL 插入

我有一张大型 MyISAM 表(约 3000 万行)。有一次我将其切换为固定行格式,因此现在表占用约 40GB 磁盘空间和 2GB 索引空间。表有一个唯一索引,每秒有 100 个“插入重复键更新”查询。随着表的增长,这些插入变得越来越慢。

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

答案1

首先,并发写入绝对不是 MyISAM 存储的选择。每个写入操作都会锁定整个表(某些情况下读取除外)。如果 InnoDB 不适合你,请尝试 TokuDB。但由于 TokuDB(当然还有 InnoDB)引擎的事务性质(你应该至少两次写入相同的数据:日志和数据文件),因此与 MyISAM 相比,它会更慢。此外,如果你的服务器某天崩溃了,你将需要等待数小时才能修复 40Gb 的 MyISAM 表。

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

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

答案2

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

相关内容