SQL优化" IS NULL"使用LEFT JOIN进行查询

时间:2017-06-19 09:49:11

标签: mysql left-join isnull sql-optimization

我正在处理涉及单词及其翻译的项目。翻译人员必须经常查询的一个查询(每10秒一次)是:

SELECT * FROM pwords p
LEFT JOIN words w ON p.id = w.wordid
WHERE w.code IS NULL
OR (w.code <> "USER1" AND w.code <> "USER2")
ORDER BY rand() LIMIT 10

接收用户尚未翻译的待翻译单词。在这种情况下,我们想要禁止USER2输入的单词

pwords表有大约66k个条目,单词表有大约55k个条目。

此查询大约需要500秒才能完成,而如果我删除IS NULL,则查询需要0.0245毫秒。我的问题是:有没有办法优化这个查询?我真的需要挤出数字。

方案是:USER1不希望单词表中的USER2有任何数据库条目。它不希望它拥有来自同一个表的数据库条目。因此,我需要使用IS NULL或类似方法从USER1和USER2以外的所有用户获取条目,无论是来自其他用户还是NULL条目。

tl; dr所以我的问题是:有没有办法让这个查询运行得更快?是&#34; IS NULL&#34;优化?

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用子查询,以便尽快过滤行(使用WHERE语句):

SELECT * 
FROM pwords p 
LEFT JOIN 
    (SELECT *
    FROM words w
    WHERE (w.code <> "USER1" AND w.code <> "USER2")) subq
ON p.id = subq.wordid
WHERE w.code IS NULL
ORDER BY rand() LIMIT 10

另一个(也许是更有效的选项)正在使用NOT EXISTS语句:

SELECT * 
FROM pwords p 
WHERE NOT EXISTS
    (SELECT *
    FROM words w
    WHERE p.id=w.wordid  AND (w.code <> "USER1" AND w.code <> "USER2")) 
ORDER BY rand() LIMIT 10