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

SQL optimize "IS NULL" query with LEFT JOIN

我正在从事一个涉及单词及其翻译的项目。译员必须经常处理的查询之一(每 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 table 有大约 66k 个条目,单词 table 有大约 55k 个条目。

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

场景是:USER1 不想要来自 USER2 的任何数据库条目 table。它不希望它自己的数据库条目来自同一个 table。因此,我需要使用 IS NULL 或类似方法从除 USER1 和 USER2 之外的所有用户获取条目,无论是来自其他用户还是 NULL 条目。

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

非常感谢任何帮助。

您可以尽快尝试使用子查询来过滤行(使用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