zoukankan      html  css  js  c++  java
  • 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条件是表的唯一字段,则不会出现笛卡尔积。

    源码,是痛苦的,又是快乐的,如果没有这痛苦,也就没有了这快乐!
  • 相关阅读:
    Java并发基础知识点总结
    Java中的可重入锁(2)
    Java中的可重入锁
    多线程的共享变量的内存不可见性
    JavaWeb 案例3— Cookie案例
    JavaWeb 案例2—response案例
    JavaWeb 之 三层架构(MVC架构):软件设计架构
    JavaWeb 之 备用9
    JavaWeb 之 备用6
    JavaWeb 之 备用7
  • 原文地址:https://www.cnblogs.com/erlongxizhu-03/p/14440383.html
Copyright © 2011-2022 走看看