一、多表查询连接的选择

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

二、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. ql的python学习之路-day13

    前言:本节主要学习模块 一.模块的定义 模块:本质是.py结尾的python文件(文件名:test.py,对应的模块是:test),用来从逻辑上组织python代码(变量.函数.类.逻辑,本质是实现一 ...

  2. OGG FOR BigData(Hive) GoldenGate 性能测试

    版本信息: Oracle GoldenGate Command Interpreter Version 12.2.0.1.160419 OGGCORE_12.2.0.1.0OGGBP_PLATFORM ...

  3. Java并发编程详解读书笔记(一)

    一.线程介绍 讲线程之前得先了解进程(Peocess),现在的操作系统基本都支持多任务的进行,举个场景:有许多的程序员们喜欢边coding边听点轻音乐.这时计算机就是做并行任务,也就是有多个进程在同时 ...

  4. jQuery的插件和跨域、ajax

    1. 插件: 也称组件 什么是: 拥有专属的HTML,CSS和js的独立页面区域 为什么: 重用! 何时: 只要一个功能/区域可能被反复使用时 如何: 3个来源: 1. 官方插件:jquery ui ...

  5. mysql小白系列_11 MHA补充

    1.ssh_user 使用VIP方式需要在新的master主机上对网卡启alias并设置IP,普通用户没权限 2.VIP问题 配置以后主从后,在MHA管理节点启动masterha_manager,VI ...

  6. mvc 页面上循环datatable

    @using System.Data; @{ Layout = null; } @{ DataTable DataServiceStaff = ViewBag.ServiceStaff as Data ...

  7. jquery.min.js v1.10.3版本autocomplete方法会在text前添加搜索出多少项的文本信息 要去除

    http://stackoverflow.com/questions/13011127/how-to-remove-change-jquery-ui-autocomplete-helper-text ...

  8. SpringBoot系列——状态机(附完整源码)

    1. 简单介绍状态机 2. 状态机的本质 3. 状态机应用场景 1. 简单介绍状态机 状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作.完成特定 ...

  9. Mybatis配置-简单的使用

    导包 基本配置 配置mybatis.config.xml文档 <?xml version="1.0" encoding="UTF-8" ?> < ...

  10. Unity调用Android Studio中的Java方法

    1. 新建Unity项目: 2. Android Studio中新建EmptyActivity: 3. 新建安卓项目时记住最小版本号: 4. 将左侧项目文件浏览面板切换到Project项下,在本项根节 ...