一、多表查询连接的选择

相信内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上,我就补贴出来了,这个图只是让大家熟悉一下各种连接查询。然后要告诉大家的是,需要根据查询的信息,想好使用哪种连接方式效率更高。

二、MySql的Join实现原理

在MySql中,只有一种Join算法,就是大名鼎鼎的Nested Loop Join,它没有其他很多数据库提供的Hash Join,也米有Sort Merge Join,顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个标中查询数据,然后合并结果。如果还有第三个参数与Join,则再通过前面两个表的Join结果作为循环基础数据,再次通过循环查询条件到第三个表中查询数据,如此往复。

三、补充:mysql对sql语句的容错问题。

即在sql语句不完全符合书写建议的情况,mysql会允许这种情况,尽可能解释他:

1)一版cross join后面加上where条件,但是用cross join + on 也是被解释为cross join + where;

2)一版内链接都需要加上on限定条件,如上面场景一;如果不加会被解释为交叉连接;

3)如果连接表格使用的是逗号,会被解释为交叉连接;

注意:sql标准中还有union join 和 natural inner join,mysql不支持,而且本身也没有多大意义,其实就是为了“健壮”。但是其实结果可以用上面的几种连接方式得到。

四、超大型数据见可能尽力不要写子查询,使用连接(join)去替换他

当然,关于这句话,也不一定就全是这样。

1)因为在大型的数据处理中,子查询是非常常见的,特别是在查询出来的数据需要进一步处理的情况,无论是可读性还是效率上,这时候的子查询都是更优。

2)然而在一些特定的场景,可以直接从数据库读取就可以的,比如一个表(A表 a,b,c字段,需要内部数据交集)join自己的效率必然比放一个子查询再where中快得多。

五、使用联合Union来代替手动创建得临时表

Union是会把结果排序的!!

union查询:它可以把需要使用临时表的两条或更多的select查询合并在一个查询中(即把两次或多次查询结果合并起来)。在客户端的查询会话结束的时候,临时表会被自动删除。从而保证数据库整齐、高效。使用union来创建查询的时候,我们只需要用union作为关键字把多个select语句连接起来就可以了,要注意的是所有select语句中的字段数据要相同。

要求:两次查询的列数必须一致(列的类型可以不一样,但推荐查询的每一列,对应的数据类型要一样)可以来自多张表的数据,多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准。如果不同的语句中取出的行,有完全相同(这里标识的是每个列的值都相同)。那么union会将相同的行合并,最终只保留一行,也可以这样理解,union会去掉重复的行。如果不想去掉重复的行,可以使用union all。

如果子句中有order by,limit,需要括号()包起来,推荐放到所有子句之后,即对最终合并的结果来排序或者筛选。

 注意:

1、Union结果集中的列名总是等于第一个select语句中的列名

2、Union内部的select语句必须拥有相同数量的列,列也必须拥有相似的数据类型,同时,每条select语句中的列的顺序必须相同。

Union all 的作用和语法:

默认的,union操作符选取不同的值,如果允许重复的值,请使用union all,当all随union一起使用时,不消除重复行。

 六、总结

(1)对于要求全面的结果时,我们需要使用连接操作(left join / right join / full join);

(2)应尽量避免在where子句中对字段进行null值判断,否则导致引擎放弃使用索引而进行全表扫描,如:

备注、描述、评论之类的可以设置为null,其它做好不要使用null。

不要以为null不需要空间,比如:char(100)型,在字段建立时,控件就固定了,不管是否插入值(null也包含在内)。都是占用100个字符的空间的。如果是varchar这样的变长字段,null不占用空间。

可以在null上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

(3)in 和 not in 也要慎用,否则会导致全表扫描,如:

很多时候,用exists代替in是个好的选择:

(4)尽量使用数字类型字段,若只含数值信息的字段,尽量不要设计为字符型,这样会降低查询和连接的性能,并会增加存储开销,这是因为引擎在处理查询和连接时,会逐个比较字符串中每一个字符。而对于数字型而言,只需要对比一次就可以了。

(5)尽量使用表变量来代替临时表,如果表变量包含大量数据,请注意索引使用非常有限(只有主键索引)。

(6)不要以为使用mysql的一些连接查询操作对查询有多么大的改善,其核心时索引。

MySql多表查询优化的更多相关文章

  1. Mysql大表查询优化技巧总结及案例分析

    http://www.169it.com/article/3219955334.html     sql语句使用基本原则:1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 orde ...

  2. 「mysql优化专题」单表查询优化的一些小总结,非索引设计(3)

    单表查询优化:(关于索引,后面再开单章讲解) (0)可以先使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的.这可以帮我们分析是查询语句或是表结构的性能瓶颈. (1)写sql ...

  3. MYSQL一次千万级连表查询优化

    概述:交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上. 这个S ...

  4. MYSQL一次千万级连表查询优化(二) 作为一的讲解思路

    这里摘自网上,仅供自己学习之用,再次鸣谢 概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别 ...

  5. MYSQL一次千万级连表查询优化(一)

    摘自网上学习之用 https://blog.csdn.net/Tim_phper/article/details/78344444 概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的 ...

  6. ( 转 ) 优化 Group By -- MYSQL一次千万级连表查询优化

    概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上. 这个 ...

  7. 3.MySQL优化---单表查询优化的一些小总结(非索引设计)

    整理自互联网.摘要: 接下来这篇是查询优化.其实,大家都知道,查询部分是远远大于增删改的,所以查询优化会花更多篇幅去讲解.本篇会先讲单表查询优化(非索引设计).然后讲多表查询优化.索引优化设计以及库表 ...

  8. MySQL 5.6查询优化器新特性的“BUG” eq_range_index_dive_limit

    本文转自 http://www.imysql.cn 最近碰到一个慢SQL问题,解决过程有点小曲折,和大家分享下. SQL本身不复杂,表结构.索引也比较简单,不过个别字段存在于多个索引中. CREATE ...

  9. 详解MySQL大表优化方案( 转)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

随机推荐

  1. 对CSS3中的transform:Matrix()矩阵的一些理解

    只要有CSS基础的人肯定都知道,我们可以通过transform中的translate,scale,rotate,skew这些方法来控制元素的平移,缩放,旋转,斜切,其实这些方法呢都是为了便于开发者使用 ...

  2. MyBatis In的使用

    http://blog.csdn.net/unei66/article/details/17792503 MyBatis In的使用 标签: mybatisin 2014-01-03 16:23 74 ...

  3. SVN:TortoiseSVN SendRpt.exe not found 完美解决

    今天来上班的时候,发现公司用的svn版本和我自己的不一致,其实可以使用但是还是神经质的更新了一下.结果每次右键都会出一个异常.下图所示. 期初以为是哪里配置错误,或者版本冲突,经过网上查找办法,完美解 ...

  4. 基于postman测试接口(整套接口测试)

    基于postman测试接口(整套接口测试) 可以解决的问题 几百个接口人工测试接口过于繁杂 大多测试无法使用请求结果当参数 可以使用随机参数 支持swagger信息导入 随账号持久化保存数据 对集合一 ...

  5. 【谎言大揭秘】Modin真的比pandas运行更快吗?

    最近看了某公众号文章,推荐了所谓的神器,据说读取速度吊打pandas,可谓牛逼,事实真是这样吗? 来一起揭秘真相. 首先安装包. # pip install ray # pip install das ...

  6. .NET Core 反射获取所有控制器及方法上特定标签

    .NET Core 反射获取所有控制器及方法上特定标签 有个需求,就是在. NET Core中,我们想在项目 启动时,获取LinCmsAuthorizeAttribute这个特性标签所有出现的地方,把 ...

  7. 日期类之SimpleDateFormat

    1.System 类下的currentTimeMillis();2.Date类:java.util.Date及其子类java.sql.Date                  如何创建实例:其下的方 ...

  8. DataFrame-选择与切片

    取得DataFrame对象reviews的description列的前10个值(或者说reviews前10行的description列): reviews.iloc[:10].loc[:,'descr ...

  9. 【极客思考】计算机网络:Wireshark抓包分析TCP中的三次握手与四次挥手

    [摘要]本文重点分析计算机网络中TCP协议中的握手和挥手的过程. [前提说明] 前段时间突然看到了一篇关于TCP/IP模型的文章,心想这段时间在家里也用wireshark抓了点包,那么想着想着就觉得需 ...

  10. 爱奇艺|B站|优酷|腾讯视频高清无水印视频下载方法(软件工具教程)

    导读:经常在大型视频网站平台上看到一些很价值和视频,希望能高清无水印下载到本地学习观看,今天小程序定制开发代码哥DaiMaGe6给大家分享一招免费下载全网高清无水印视频的方法. 高清无水印视频下载工具 ...