如何在不锁定的情况下插入数万行?

Dou*_*ram 3 mysql myisam locking

我有一台服务器,可以接收来自世界各地数千个地点的数据。该服务器定期连接到我的数据库服务器并快速连续插入记录,一次一行。最多可以有 6 个这样的进程 (perl) 同时运行,每个进程可能有超过 50,000 个插入语句,随后,表被锁定。

我想弄清楚是什么导致锁定?我是否最好创建一个多插入,比如,一次 100 行,然后首尾相连?我用什么作为指导方针?

DB 服务器有 100GB RAM 和 12 个处理器。它很少使用,但是当这些插入内容出现时,每个人都会冻结几分钟,这会干扰人们运行报告等。

感谢您的任何建议。我知道我需要错开插入,我只是问什么是推荐的方法来做到这一点。

Ric*_*mes 7

无法摆脱所有锁定。但是,有一些方法可以加快您正在执行的操作:

  • 使用多行INSERTs。一次 100 行的运行速度将提高 10 倍。
  • 如前所述,使用pt-online-schema-change. 然后将多个INSERTs放入一个事务中(BEGIN... COMMIT)。
  • 6 个线程可以写入 6 个不同的表(例如CREATE TEMPORARY TABLE),然后INSERT INTO real_table SELECT * FROM tmp_table. 即使在 MyISAM 上,由于 6 个锁而不是 6*50K,它的运行速度也会明显加快。阅读有关concurrent_insert如何避免 50K 表锁定到 tmp 表的信息。

请向我们展示SHOW CREATE TABLE. 可能还有其他重大问题,尤其是索引。