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