MySQL使用in查詢效率慢解決方法——使用左連接【或右連接】


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條件是表的唯一字段,則不會出現笛卡爾積。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM