mysql多表查询优化_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,需要括号()包起来,推荐放到所有⼦句之后,即对最终合并的结果来排序或者筛选。
注意:
mysql语句多表查询
1、Union结果集中的列名总是等于第⼀个select语句中的列名
2、Union内部的select语句必须拥有相同数量的列,列也必须拥有相似的数据类型,同时,每条select语句中的列的顺序必须相同。
Union all 的作⽤和语法:语句覆盖是指
默认的,union操作符选取不同的值,如果允许重复的值,请使⽤union all,当all随union⼀起使⽤时,不消除重复⾏。
六、总结
(1)对于要求全⾯的结果时,我们需要使⽤连接操作(left join / right join / full join);
update语句修改指定表中满足条件的记录(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)尽量使⽤数字类型字段,若只含数值信息的字段,尽量不要设计为字符型,这样会降低查询和连接的性能,并会增加存储开销,这是因为引擎在处理查询和连接时,会逐个⽐较字符串中每⼀个字符。⽽对于数字型⽽⾔,只需要对⽐⼀次就可以了。
idea unicode转中文
(5)尽量使⽤表变量来代替临时表,如果表变量包含⼤量数据,请注意索引使⽤⾮常有限(只有主键索引)。
(6)不要以为使⽤mysql的⼀些连接查询操作对查询有多么⼤的改善,其核⼼时索引。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。