[英]SQL left join query runs VERY slow
基本上我正在嘗試提取一個用戶尚未從數據庫響應的隨機輪詢問題。 這個查詢大約需要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
問題和響應表的PK是“id”,如果重要的話。
任何建議將不勝感激。
你很可能需要一個索引
responses.questionID
responses.username
沒有索引搜索30k行總是很慢。
這是一種不同的查詢方法,可能更快:
SELECT q.id
FROM questions q
WHERE q.id NOT IN (
SELECT r.questionID
FROM responses r
WHERE r.username = 'someuser'
)
確保r.username
上有一個索引,這應該非常快。
以上將返回所有未回答的問題。 要選擇隨機的一個,你可以使用效率低(但很容易)的ORDER BY RAND() LIMIT 1
,或者使用Tom Leys建議的方法。
問題可能不是連接,它幾乎可以肯定按順序排序30k行rand()
請參閱: 不要按蘭特訂購
他建議(在這個例子中用你的查詢替換引號)
SELECT COUNT(*) AS cnt FROM quotes
-- generate random number between 0 and cnt-1 in your programming language and run
-- the query:
SELECT quote FROM quotes LIMIT $generated_number, 1
當然,您可以將第一個語句作為第二個語句中的子選擇。
OP是否確定原始查詢返回正確的結果集?
我假設添加了“AND responses.username ='someuser'”子句來加入規范,意圖加入將為只有某些用戶沒有回答的id生成空的右側列。
我的問題:加入不會為每個問題都生成空的右側列。所有用戶都沒有回答過問題。 左連接的工作原理是,“如果目標表中的任何行與連接表達式不匹配,則會為SELECT列列表中的目標表的所有列引用生成NULL值。”
在任何情況下,nickf的建議對我來說都很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.