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条件是表的唯一字段,则不会出现笛卡尔积。

 

本文作者:好Wu赖

本文链接:https://www.cnblogs.com/erlongxizhu-03/p/14440383.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   好Wu赖  阅读(4252)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起