Mysql 如何正确地错开数千个插入项以避免锁定表?

Mysql 如何正确地错开数千个插入项以避免锁定表?,mysql,locking,Mysql,Locking,我有一个服务器,可以接收来自世界各地数千个地点的数据。该服务器定期连接到我的数据库服务器,并使用multi-insert插入记录,每个multi每次插入11000行,最多插入6条insert语句。发生这种情况时,所有6个进程都会锁定要插入的表 我想弄清楚是什么导致了锁定?我是否最好将多重插入限制为每次100行,并进行端到端的插入?我使用什么作为指导方针 DB服务器有100GB RAM和12个处理器。它的使用非常简单,但当这些插入进来时,每个人都会冻结几分钟,这会干扰人们运行报告等 谢谢你的建议。

我有一个服务器,可以接收来自世界各地数千个地点的数据。该服务器定期连接到我的数据库服务器,并使用multi-insert插入记录,每个multi每次插入11000行,最多插入6条insert语句。发生这种情况时,所有6个进程都会锁定要插入的表

我想弄清楚是什么导致了锁定?我是否最好将多重插入限制为每次100行,并进行端到端的插入?我使用什么作为指导方针

DB服务器有100GB RAM和12个处理器。它的使用非常简单,但当这些插入进来时,每个人都会冻结几分钟,这会干扰人们运行报告等

谢谢你的建议。我知道我需要错开插入件,我只是想问一下推荐的方法是什么


更新:我错了。我和程序员谈过,他说有一个perl程序正在运行,它可以尽可能快地向服务器发送单个插入。不是多重插入。目前有6个perl进程同时运行。其中一个正在做91000次插入,一次一个。也许因为我们有很多RAM,多插入会更好?

您的问题缺少关于系统结构的大量细节。此外,如果您有一个数据库运行在一个内存为100GB的服务器上,那么您应该可以访问专业的DBA,而不是依赖于internet论坛

但是,正如lad2025在一篇评论中所建议的,临时表可能会解决您的问题。锁定可能是由索引或触发器引起的。建议将数据加载到暂存表中。然后,从容不迫地将数据从临时表加载到最终表中

一种可能是进行11000次插入,比如说每秒一次(需要大约三个小时)。虽然在执行插入时会有更多的开销,但每个插入都是自己的事务,并且锁定时间非常短

当然,一次只插入一条记录可能不是最佳选择。也许10个、100个甚至1000个就足够了。您可以使用事件计划程序管理插入


并且,这假设锁定根据输入数据的量进行缩放。这是一个假设,但我认为在没有其他信息的情况下这是一个合理的假设。

也许您应该准备不带外键和索引的临时表,因为它更适合这个问题。。。也许你用的是什么发动机?是基于HDD还是SSD?在服务器上进行了哪些调优?在我看来,它可能有一些部门的规格太离谱了,而在另一些部门则完全不够。例如,对数据库使用RAID-5将使写入速度绝对糟糕。您是否尝试过对较小的插入与较大的插入进行基准测试?您是否观察过哪些锁可能会干扰写入性能?谢谢Jorge。我会的。了解那些Perl程序在做什么会很有帮助。他们是否在一次交易中插入91000个?他们在锁桌子吗?您使用的是什么表格格式(MyISAM在锁方面很糟糕)?这些表上有什么索引?将插入多少个表?慢速查询日志会说什么?是的,锁定似乎会随着负载的增加而扩展。我们可以访问大量的服务器资源。进行阶段数据库有什么帮助?它最终还是要进行插入循环?@DougWolfgram。它将所有数据带入数据库环境。这通常是跟踪事务的一大便利——比如重新启动事务,或者查看正在处理的数据,或者只是管理批处理。这似乎是一个前进的好方法。