【问题标题】:How do I properly stagger thousands of inserts so as not to lock a table?如何正确错开数千次插入以免锁定表?
【发布时间】:2023-03-25 18:50:01
【问题描述】:

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

我想弄清楚是什么导致了锁定?我是否最好将我的多插入限制为一次 100 行并端对端进行?我用什么作为指南?

数据库服务器有 100GB RAM 和 12 个处理器。它的使用非常轻,但是当这些插入物进来时,每个人都会冻结几分钟,这会破坏人们运行报告等。

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

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

【问题讨论】:

  • 也许你应该准备没有外键和索引的临时表
  • 也许dba.stackexchange.com 更适合这个问题......也许
  • 你用的是什么引擎?它是基于 HDD 的,还是基于 SSD 的?服务器上做了哪些调整?在我看来,它的规格可能在某些部门令人发指,但在其他部门却完全不足。例如,对数据库使用 RAID-5 将使写入速度变得非常糟糕。您是否尝试过对较小的刀片和较大的刀片进行基准测试?您是否查看过哪些锁可能会干扰写入性能?
  • 谢谢豪尔赫。我会这样做的。
  • 了解那些 Perl 程序在做什么会很有帮助。他们是否在单个事务中执行 91,000 次插入?他们在锁定表吗?你使用什么表格式(MyISAM 对锁很糟糕)?这些表上有哪些索引?插入了多少张表?慢查询日志说明了什么?

标签: mysql locking


【解决方案1】:

您的问题缺少有关系统结构的大量细节。此外,如果您的数据库在 100 GB RAM 的服务器上运行,您应该可以访问专业的 DBA,而不是依赖互联网论坛。

但是,正如 lad2025 在评论中所建议的那样,临时表可能可以解决您的问题。您的锁定可能是由索引引起的,也可能是由触发器引起的。建议是将数据加载到临时表中。然后,悠闲地将临时表中的数据加载到最终表中。

一种可能性是执行 11,000 次插入,例如每秒一次(大约需要三个小时)。虽然插入的开销更大,但每个都是自己的事务,锁定时间会很短。

当然,一次只插入 1 条记录可能不是最优的。也许 10 或 100 甚至 1000 就足够了。您可以使用事件调度程序管理插入。

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

【讨论】:

  • 是的,锁定似乎会随着负载的增加而扩展。我们可以访问大量的服务器资源。通过暂存数据库有什么帮助?它仍然必须最终插入 cirrect 吗?
  • @DougWolfgram 。 . .它将所有数据带入数据库环境。这通常为跟踪事务提供了很大的便利——比如重新启动它们,或者查看正在处理的数据,或者只是管理批次。
  • 是的,我们已经考虑过了。似乎是前进的好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
相关资源
最近更新 更多