我有一张大型 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 语句以及许多其他插入优化。除非您将不同的分区放在不同的物理磁盘上,否则分区无济于事。