2016-03-28 38 views
1

我有以下查詢返回用戶id是不是在message_log表查詢採取了很長一段時間

select * from likes where userid not in(select to_id from message_log) 

我在喜歡錶中的用戶ID列的索引,並在to_id列的索引在message_log表中,但索引沒有根據EXPLAIN使用。我的查詢有問題嗎?我的查詢已經運行了20分鐘,仍然沒有結果。

+0

也許你有太多的行嗎?考慮使用'加入' – Ian

+0

我應該使用左連接還是內連接? – Arya

+0

應該是左連接,因爲你想包含'likes'中的所有內容,儘管它不存在於'message_log'中。但只是好奇,你有多少行? – Ian

回答

2

你可以試試,你應該考慮的是轉彎子查詢到加入這個

select * from likes lk where not exists (select 1 from message_log where to_id = lk.userid) 
+0

第一個返回任何內容,第二個返回此錯誤 錯誤:在「to_id」處或附近的語法錯誤 LINE 1:... elect * from likes左加入message_log毫升to_id = like ... ^ **********錯誤********** 錯誤:語法錯誤處於或接近「to_id」 SQL狀態:42601 字符:53 – Arya

+0

我的查詢耗時30分鐘執行,返回64742行,但發佈加入的行返回138095行 – Arya

+0

您有重複的用戶ID? –

2
select * 
from likes 
    left join message_log ml on ml.to_id=likes.userid 
where ml.to_id is null 

嘗試使用LEFT查詢JOIN,而不是留下唯一的用戶ID,而不mesages

+0

我收到此錯誤 錯誤:語法錯誤處於或接近「to_id」 LINE 3:left join message_log ml on ml to_id = likes.userid ^ **********錯誤********** 錯誤:「to_id」處或附近的語法錯誤 SQL狀態:42601 字符:61 – Arya

+0

已更正。添加丟失點 – StanislavL

+0

完全沒有返回行 – Arya

1

的第一件事。像這樣:select like.col1, like.col2 from likes like left join message_log mlog on like.userid = mlog.to_id where mlog.to_id is null 雖然優化器很可能會爲您做到這一點。

你應該嘗試的另一件事是擺脫select子句中的星號(如我的示例),因爲它可能會影響優化程序使用的索引。