MySql多表查询优化
一、多表查询连接的选择

相信内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上,我就补贴出来了,这个图只是让大家熟悉一下各种连接查询。然后要告诉大家的是,需要根据查询的信息,想好使用哪种连接方式效率更高。
二、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多表查询优化的更多相关文章
- Mysql大表查询优化技巧总结及案例分析
http://www.169it.com/article/3219955334.html sql语句使用基本原则:1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 orde ...
- 「mysql优化专题」单表查询优化的一些小总结,非索引设计(3)
单表查询优化:(关于索引,后面再开单章讲解) (0)可以先使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的.这可以帮我们分析是查询语句或是表结构的性能瓶颈. (1)写sql ...
- MYSQL一次千万级连表查询优化
概述:交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上. 这个S ...
- MYSQL一次千万级连表查询优化(二) 作为一的讲解思路
这里摘自网上,仅供自己学习之用,再次鸣谢 概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别 ...
- MYSQL一次千万级连表查询优化(一)
摘自网上学习之用 https://blog.csdn.net/Tim_phper/article/details/78344444 概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的 ...
- ( 转 ) 优化 Group By -- MYSQL一次千万级连表查询优化
概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上. 这个 ...
- 3.MySQL优化---单表查询优化的一些小总结(非索引设计)
整理自互联网.摘要: 接下来这篇是查询优化.其实,大家都知道,查询部分是远远大于增删改的,所以查询优化会花更多篇幅去讲解.本篇会先讲单表查询优化(非索引设计).然后讲多表查询优化.索引优化设计以及库表 ...
- MySQL 5.6查询优化器新特性的“BUG” eq_range_index_dive_limit
本文转自 http://www.imysql.cn 最近碰到一个慢SQL问题,解决过程有点小曲折,和大家分享下. SQL本身不复杂,表结构.索引也比较简单,不过个别字段存在于多个索引中. CREATE ...
- 详解MySQL大表优化方案( 转)
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...
随机推荐
- java 四舍五入 保留n为数
double x1 = 0.026;String format = String.format("%.2f", x1);System.out.println(format); St ...
- c#与js客户端之间相互传值
RegisterStartupScript(key, script) RegisterClientScriptBlock(key, script) 第一个参数 key 是插入的客户端脚本的唯一标识符. ...
- python基础学习笔记(纸质)
大一的时候学的python做的笔记.
- promise对象里resolve和reject状态讲解及Promise.all()的使用
首先来说下同步异步与阻塞非阻塞的概念,同步异步与阻塞非阻塞并没有关系.同步异步主要是事情做完以后,如何进行处理.或者说关注的是一种消息通信机制. 同步的情况下,是由处理消息者自己去等待消息是否被触发: ...
- mysql日志体系大盘点
MySql日志文件主要包含:错误日志.慢查询日志.事务日志.二进制日志等 Mysql的日志配置可以通过命令 show global variables like '%log%'; 执行的结果如下 &q ...
- 树形DP基础题 HDU1520
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- UVALive3720
题目大意:见刘汝佳<算法竞赛入门经典——训练指南>P173. 解题思路: 问题可以转化为求共有多少条过点阵中的点的斜线.其中必定包含左斜线和右斜线,由于点阵式对称的,所以我们只需求出左右斜 ...
- 《计算机网络》课程笔记 (Ch03-运输层)
为运行在不同主机上的应用进程之间提供逻辑通信功能. 将应用层报文切分为块,然后加上运输层首部,形成报文段,交付给网络层. 多路复用与多路分解 将网络层提供的主机到主机交付服务延伸到进程到进程交付服务. ...
- 【Windows】win10:硬件良好,软件系统出错
平台:戴尔G3, win10 现象:能正常开机,开机后前几分钟内能打开部分应用,经过大约两分钟后系统无法正常使用. 分析:此次问题出现再新购买的笔记本电脑中,鉴于电脑刚买,硬件坏的可能性很小,然而为了 ...
- eatwhatApp开发实战(五)
上次我们为eatwhat添加了了删除功能和dialog对话框的介绍,今天我们来使用SQLite进行本地数据存储. 首先,我们定义一个SQL辅助类ShopInfoOpenHelper继承SQLiteOp ...