【问题标题】:The total number of locks exceeds the lock table size in MySQL锁的总数超过了 MySQL 中的锁表大小
【发布时间】:2015-02-26 17:40:33
【问题描述】:

我有一个这样定义的表: 其中ProviderId 是主键,StateID 是来自另一个表的外键。它在我的笔记本电脑上运行,因此,它是一个本地数据库。在我的表中,我有大约 900 万个条目。我知道事实上,表中有重复的条目,但只有当我们将它们与一些字段进行比较时,它们才是重复的。为了删除重复的条目,我运行了以下查询:

SET SQL_SAFE_UPDATES=0;
DELETE p1.*
FROM providers AS p1
JOIN (SELECT ProviderName AS PName, Address AS PAddr, StateID, Zip, MIN(ProviderId) AS PId
      FROM providers
      GROUP BY PName, PAddr, StateID, Zip
      HAVING COUNT(*) > 1) AS p2
ON p1.ProviderName = p2.PName
AND p1.Address = p2.PAddr
AND p1.StateID = p2.StateID
AND p1.Zip = p2.Zip
AND p1.ProviderId > p2.PId;

关键是,它运行了大约 4 个半小时,它向我显示了标题上写的错误消息。你也可以看到它: 如何使查询更快,并克服收到的错误消息?

【问题讨论】:

  • 你能澄清一下查询试图做什么吗?我了解加入但我不明白为什么p1.providerID > p2.id?您是否尝试选择除最小提供商 ID 之外的所有内容?
  • @McAdam331 正如我所写的,我尝试从表中删除重复的条目。我检查两个(或更多)行是否具有相同的 ProviderNameAddressStateIDZip 值。如果有,我想删除所有其他的,只留下一个。
  • 好的。我不认为你可以用你的查询做任何事情,但我发现这个article 可能会有所帮助。这似乎只是因为你的桌子太大了。也许将其分解为更小的增量并运行 2 或 3 个删除查询?
  • 您是否尝试过LIMIT 子句并简单地运行多次?
  • @MarcusAdams 不是真的没有。你的意思是制作类似... AND p1.ProviderId > p2.PId LIMIT 0, 100000;的东西?

标签: mysql database


【解决方案1】:

我不确定我是否达到了你的目标,

你最好提供 sqlfiddle

但你可以试试:

SET SQL_SAFE_UPDATES=0;
DELETE p1
FROM providers AS p1
WHERE ProviderId NOT IN  (
      SELECT
        MIN(ProviderId) 
      FROM providers
      GROUP BY PName, PAddr, StateID, Zip
) 

【讨论】:

  • 我喜欢这种方法,我什至根本没有这样想过。这可能更快,但来自article 我不确定速度是否是问题?
  • 是的,这更简单。不过,正如 @McAdam331 所说,分解工作量也有帮助。
【解决方案2】:

根据我发现的article,看来问题在于您的表格大小。

您的查询将起作用,但我建议将其分解为更小的组。例如,如果您的 providerID 范围从 1 到 900 万(根据您的问题),您可以添加到 where 子句中:

WHERE ProviderID <= 1000000;

然后使用 200 万、300 万等再次运行它。我不确定组必须有多小,这可能需要反复试验。

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多