我正在处理涉及单词及其翻译的项目。翻译人员必须经常查询的一个查询(每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;优化?
非常感谢任何和所有帮助。
答案 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