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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HttpCanary教程_jquery post json

    HttpCanary教程_jquery post jsonHttpResponse对象Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响

    2022年8月7日
    2
  • android4.4.3_安卓内核版本升级

    android4.4.3_安卓内核版本升级Android4.4源码下载(linux合并)==============================分割线结束=========================旧版本的可以使用115,不想再去115搬运了4g多不是很想上传邮箱吱吱的响受不了,上传下吧,要学会摆脱windows不会linux玩android也没少哈意思,不是?下载所有的droiSplit包split分割的,。wi…

    2022年8月10日
    7
  • JAVA MD5加密「建议收藏」

    JAVA MD5加密「建议收藏」一、什么是MD5加密MD5,全称为“MessageDigestAlgorithm5”,中文名“消息摘要算法第五版”,它是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。严格来说,它是一种摘要算法,是确保信息完整性的。不过,在某种意义上来说,也可以算作一种加密算法。MD5算法具有很多特点:压缩性:任意长度的数据,算出的MD5值长度都是固

    2022年7月8日
    38
  • python操作windows窗口获取窗口句柄「建议收藏」

    python操作windows窗口获取窗口句柄「建议收藏」python获取窗口句柄在Windows下获取窗口句柄时操作系统版本和软件版本对获取有影响,就会出现在本地调试正常的程序,交付使用的时候报错。查看windows所有可显示的窗口句柄及窗口名称。#-*-coding:utf-8-*-“””FileNamewindows_guiCreatedon2019-11-06@author:jj”””importwin…

    2022年7月14日
    38
  • C语言空格代码_c语言中空格是字符吗

    C语言空格代码_c语言中空格是字符吗一、逗号,之后加空格printf("error!score[%d]=%d\n",i,score[i]);二、分号;之后加空格for(i=0;i<student_num;i++);三、关系运算符<、<=、>、>=、==、!=前后加空格if((score[i]>=0)&&(s…

    2022年9月15日
    0
  • java python哪个好_java和python哪个更好用?(一)[通俗易懂]

    java python哪个好_java和python哪个更好用?(一)[通俗易懂]JavaJava是世界上最古老,功能最强大的编程语言之一。它是一种通用的静态类型的语言。这意味着任何人都可以使用它。使用此编程语言没有特定的目的。Java还是一种面向对象的编程语言。这使其成为易于使用的编程语言之一。Java还是一种可移植的编程语言,可以在WORA上运行(一旦在任何地方运行,编写一次)。这意味着您可以在特定计算机上编写Java程序,并在任何平台上使用它。您需要拥有Java虚拟机(…

    2022年7月8日
    19

发表回复

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

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