簡體   English   中英

SQL左連接查詢運行非常慢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM