今天老大问到内连接外连接的查询速度问题,之前没有了解过因为做的项目比较小所以没有在效率上考虑过。今天问到了就查一下文档和大佬们的博客总结一下,以后有需要也可以查看博客温习。

内连接和外连接其实是有步骤区分的  外连接在步骤上是比内连接多出一步的从下图的解析上可以看出这个是mysql执行的时候执行顺序可以看出外连接是比内连接多出了一步操作。但是具体效率并没有多少区分还是由语句决定大部分的执行效率。而且左连接语句有时候会被数据库优化器自动转化为内连接,所以该语句优化器判断为合适执行内连接并且效率高。

                   下面是对语句的分析

对于左连接和右连接来说对效率影响最大的还是约束的影响,所以where约束出的结果集大小决定其查询的效率(多表查询)

在语句书写的时候有基础表和连接表区分。在连接时基础表数据量越少查询出的结果集就越少所以要将数据量少的表当做基础表来使用。然后就是where语句是由上至下执行的所以每一步产生的结果集大小影响下一步查询的效率所以要将产生结果集最少的约束往前放,当然两表连接的约束要放到最前。接下来就是索引,索引是对表的某个字段进行索引并记录到磁盘上,索引查询会直接读取记录比从表查询会快很多,但是如果数据量很大的话索引建立会很慢所以不能频繁的添加删除索引而且复合索引一定程度也会降低查询效率所以要适量增加索引不能盲目添加很多索引。在数据库记录更改的情况下,索引也是需要记录的所以在有表的记录是频繁更改的情况下不推荐添加索引或者添加大量索引,会造成索引大量维护,占用资源。

在有索引的时候索引表最好作为内连接和外连接的副表,增加其查询效率。(主键是对表记录的约束,索引是对表记录的索引,类似于对表记录进行标记,在查询时依赖索引可以快速到大标记的那个记录增加效率)

所以在外连接和内连接选取时更看重语句:实际情况是最重要的,语句应尽可能为下一个约束减少结果集的记录条数,数量大的时候应将有索引的约束置于前方。

索引建立规范:

表主键、外键一定有索引

数据量大的应该有索引

经常做连接查询的表应该在连接字段建立索引

经常在where约束之后的字段,尤其表的字段非常多的情况下要加索引

索引最好建立在小字段上,大文本或者超长字段均不适合加索引

频繁对数据进行操作的表不适合建立索引

无用的索引应尽早删除

外连接步骤:先将主表全部列出将右表满足on约束的展示出来建立结果集,再通过where约束选取结果集

内连接步骤:将两表由连接约束合并起来然后继续执行where约束选取结果集

还有就是尽量减少查询结果集字段为*的情况,只查询有用的出来,因为如果是*的时候数据库会挨个匹配字段拿出也会影响效率!语句中对表的重命名如果表明很长尽量要重命名,减少数据库对表明的检索

个人见解,如果有不同或者更优解释希望大佬指出谢谢!