锁的总数超过了MySQL中的锁表大小

时间:2015-02-26 17:40:34

标签: mysql database

我有一个像这样定义的表: enter image description here 其中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个半小时,它向我显示了标题上写的错误消息。你也可以看到它: enter image description here 如何更快地进行查询,并克服我收到的错误消息?

2 个答案:

答案 0 :(得分:2)

我不确定我是否实现了目标,

你应该更好地提供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
) 

答案 1 :(得分:1)

根据我发现的这个article,问题似乎在于你桌子的大小。

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

WHERE ProviderID <= 1000000;

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