Bri*_*ian 9 mysql sql optimization
基本上我正在尝试提取一个用户尚未从数据库响应的随机轮询问题.这个查询大约需要10-20秒才能执行,这显然不行!响应表大约是30K行,数据库也有大约300个问题.
SELECT questions.id
FROM questions
LEFT JOIN responses ON ( questions.id = responses.questionID
AND responses.username = 'someuser' )
WHERE
responses.username IS NULL
ORDER BY RAND() ASC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
问题和响应表的PK是"id",如果重要的话.
任何建议将不胜感激.
Cha*_*ion 11
你很可能需要一个索引
responses.questionID
responses.username
Run Code Online (Sandbox Code Playgroud)
没有索引搜索30k行总是很慢.
这是一种不同的查询方法,可能会更快:
SELECT q.id
FROM questions q
WHERE q.id NOT IN (
SELECT r.questionID
FROM responses r
WHERE r.username = 'someuser'
)
Run Code Online (Sandbox Code Playgroud)
确保有一个索引r.username,这应该很快。
以上将返回所有未回答的问题。要随机选择一个,您可以选择低效(但容易)ORDER BY RAND() LIMIT 1的方法,或者使用 Tom Leys 建议的方法。