MySQL多表关联查询优化

MySQL多表关联查询优化背景最近在对运营报表导出进行优化,总结了一些多表关联查询优化的点记录一下。避免临时表通过Explain分析SQL语句,尽量不要使用到临时表。GROUPBY(Explain具体详解,可以看这篇博客)最容易造成使用临时表,GROUPBY与临时表的关系:  1.如果GROUPBY的列没有索引,产生临时表.  2.如果GROUPBY时,SELECT的列不止GROUP…

大家好,又见面了,我是你们的朋友全栈君。

背景

最近在对运营报表导出进行优化,总结了一些多表关联查询优化的点记录一下。

避免临时表

通过 Explain 分析 SQL 语句,尽量不要使用到临时表。GROUP BY (Explain具体详解,可以看这篇博客

最容易造成使用临时表,GROUP BY 与临时表的关系 :
  1. 如果GROUP BY 的列没有索引,产生临时表.
  2. 如果GROUP BY时,SELECT的列不止GROUP BY列一个,并且GROUP BY的列不是主键 ,产生临时表.
  3. 如果GROUP BY的列有索引,ORDER BY的列没索引.产生临时表.
  4. 如果GROUP BY的列和ORDER BY的列不一样,即使都有索引也会产生临时表.
  5. 如果GROUP BY或ORDER BY的列不是来自JOIN语句第一个表.会产生临时表.
  6. 如果DISTINCT 和 ORDER BY的列没有索引,产生临时表.
如果业务需求没法更改,也不需要强制去掉临时表。

缩小数据范围

接下来进行优化第二步,将临时表缩小到最小范围。SQL 执行过程大体如下:

  1. 执行FROM语句
  2. 执行ON过滤
  3. 添加外部行
  4. 执行where条件过滤
  5. 执行group by分组语句
  6. 执行having
  7. select列表
  8. 执行distinct去重复数据
  9. 执行order by字句
  10. 执行limit字句

当两个表进行Join操作时,主表的Where限制可以写在最后,但从表分区限制条件不要写在Where条件中,建议写在ON条件或者子查询中。主表的分区限制条件可以写在Where条件中(最好先用子查询过滤)。示例如下:

select * from A join (select * from B where dt=20150301)B on B.id=A.id where A.dt=20150301; 
select * from A join B on B.id=A.id where B.dt=20150301; --不允许 
select * from (select * from A where dt=20150301)A join (select * from B where dt=20150301)B on B.id=A.id;

第二个语句会先Join,后进行分区裁剪,数据量变大,性能下降。在实际使用过程中,应该尽量避免第二种用法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138924.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • spssχ2检验_案例实践:SPSS分层卡方检验[通俗易懂]

    spssχ2检验_案例实践:SPSS分层卡方检验[通俗易懂]两个分类变量卡方检验用着爽,但有一点需要强调一下,要不要控制混杂因素的影响,也许在混杂的影响下,卡方检验的结果并不是原先的那个样子,而我们陷入自我欺骗陷阱还不自知。分层卡方检验,则是在普通卡方检验(一般是2×2)基础上增加一个控制混杂的分层变量,让我们的研究更加现实,考虑到多方面的因素,实际上已经算是一种多因素的分析手段了。案例介绍文彤老师SPSS基础教程上有一个不错的案例。某研究调查了口服避孕药…

    2022年5月16日
    56
  • 基于python的安全帽识别安全帽检测可以检测图片,视频流,有界面[通俗易懂]

    基于python的安全帽识别安全帽检测可以检测图片,视频流,有界面[通俗易懂]安全帽识别,安全帽检测yolo可以检测图片,视频流,有界面python识别率99%效果图:效果视频:项目代码下载:链接:https://pan.baidu.com/s/1CpcDb1LHpF84svV66blJSw提取码:86sq复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V1的分享…

    2022年5月12日
    54
  • FileInputStream读取文件数据的两种方式

    FileInputStream读取文件数据的两种方式FileInputStream(文件字节读取流):read():一个一个字节的读read(byte[]buf):先把字节存入到缓冲区字节数组中,一下读一个数组(常用)importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava….

    2022年5月5日
    332
  • MAC上IDEA Intellij 卸载

    MAC上IDEA Intellij 卸载23456cd /Applications/rm -rIntelliJ\IDEA\14.app/rm -r /Users/sunlu/Library/Logs/IntelliJIdea14/rm -r /Users/sunlu/Library/Preferences/IntelliJIdea14/rm -r /Users/sunlu/Library/Application\Support/…

    2022年6月18日
    46
  • 用navicat 连接sqlserver提示要安装 sql server native client

    用navicat 连接sqlserver提示要安装 sql server native client解决办法:打开navicat安装目录,找到navicat自带sqlncli_x64.msi,安装后问题解决!说明:我用的是64位的全功能安装版的navicat,亲测可用。谢谢!

    2022年10月21日
    3
  • USB协议基本知识[通俗易懂]

    USB协议基本知识[通俗易懂]USB基本知识USB的重要关键概念:1、端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)2、帧:时间概念,在USB中,一帧就是1MS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份中是一个USB的传输动作。3、upstream、…

    2022年6月16日
    182

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号