MySQL使用in查詢效率慢解決方法——使用左連接【或右連接】
有一個表共3804條記錄
SELECT createtTimer, ip, oss FROM douying3_action WHERE ip IN ( SELECT ip FROM douying3_action GROUP BY ip HAVING COUNT(ip) > 1 );
我使用in查詢,需要57秒時間,效率太慢了,無法忍受,於是尋找解決辦法,
網上有說加索引解決的,但是個人感覺這個數據量並不大,加索引即使能夠解決問題,等日后數據量逐漸增大之時這似乎並不是一個非常好的辦法。
網上還有說把in改為exist,但是查詢效率似乎並沒有什么改變。通過搜閱資料得知in適合用於子表小的情況,而exist適合子表大主表小的情況,(僅代表一家之言,可能有不到之處,日后細究)。
解決方法如下:
經對數據庫方面的文章參考,最終找到了一個方法,把in改為左連接右連接的方式,
SELECT b.createtTimer, b.ip, b.oss FROM ( SELECT ip FROM douying3_action GROUP BY ip HAVING COUNT(ip) > 1 ) a LEFT JOIN douying3_action b ON a.ip = b.ip
查詢效率瞬間提升,耗時0.2秒,提高了將近300倍。
左連接是以左表為准,左表有m條記錄,則結果集是m條記錄,相比內連接產生笛卡爾積臨時表,記錄數少很多內存小很多 所以速度快。
連接查詢,如果on條件是非唯一字段,會出現笛卡爾積(局部笛卡爾積);如果on條件是表的唯一字段,則不會出現笛卡爾積。