修复mysql查询

时间:2011-02-04 20:48:33

标签: mysql

DELETE FROM keywords
WHERE NOT EXISTS
(SELECT keywords_relations.k_id FROM keywords_relations WHERE keywords.k_id = keywords_relations.k_id)

这花了太长时间......我有583,000个关键字(utf_unicode)和100万个关键字。在过去,查询曾经在20-60秒内发生,但我现在尝试运行它并且半小时内没有发生。

你能否提出一些可能错误的建议。此外,此查询的任何其他更改。

我正在尝试从关键字关系表中不存在id的关键字表中删除关键字。

由于

该网站为http://domainsoutlook.com/

您可以尝试继续操作,还可以看到所有查询都运行缓慢。

PS。几天前服务器崩溃,我的服务器维护支持在磁盘上执行了fsck检查或其他操作。

关键字的索引= k_id(主要),关键字(唯一) keywords_relations = k_id(index)

的索引

3 个答案:

答案 0 :(得分:3)

尝试这一点,看看它是否有所作为:

DELETE keywords
    FROM keywords
        LEFT JOIN keywords_relations
            ON keywords.k_id = keywords_relations.k_id
    WHERE keywords_relations.k_id IS NULL

答案 1 :(得分:1)

已知

WHERE NOT EXISTS (subquery)会导致MySQL< 5.4中的性能问题。请改用LEFT JOIN

警告:在运行实时数据库之前测试它。我对数据丢失不承担任何责任。

DELETE 
  k
FROM 
  keywords AS k
LEFT JOIN
  keywords_relations AS kr
USING (k_id)
WHERE
  kr.k_id IS NULL

答案 2 :(得分:1)

如果有一个或多个属于它的keyword_relations,我认为您不想删除关键字。因此,您可以做的第一件事就是在LIMIT 1 - 查询中添加SELECT

您确定已为k_id设置了索引,对吗?如果是的话,这实际上不应该是MySQL的事情......