自然连接查询
通过上面的图我们注意到,自然连接的语法是JOIN ON,as 后面就是对应表和字段的别名,JOIN后面是连接的表,ON后面是连接的条件。
我们查询的数据量是16000条,我们使用表的引擎是MYISAM。
我们来看这次查询的时间是:4.527ms(这个查询是简单查询,没有加索引)
我们给ON条件的字段加索引,查询的时间是:3.507ms
我们在后面建立了一个复合索引
我们再看另一个场景,只出现staff_id和rental_id情景:
查询时间是:3.219ms
我们现在把三个字段都加上
查询的时间是:1.954ms
为什么会这么神奇,代码就相差一个字段,查询的时间差就很大呢?我来解释一下:我们创建的复合索引,如果让索引生效就要从左向右一次出现对应的字段,不能有空,比如123,你写的是13中间隔了一个,索引就失效。还有一种情况12索引也是生效。因为索引没有生效才会出现这种情况。
我们来看一下子查询
所用时间:7.126ms
把他转化成自然连接
所用时间:1.160ms
总结:
1、我们要给自然连接查ON后面的字段加索引来提高查询的效率,注意如果是复合索引,那么我们查询字段顺序一定是按照复合索引从左向右的顺序。
2、我们对比了子查询和自然连接查询,他们相差还是很大的,优化的办法就是我们把子查询转换成自然连接查询。
3、自然连接查询多的时候一定要要给表和字段起别名,为了方便后面查询。如果不这样做就是表名加字段,太长了。SQl语句看起来很乱。
左连接查询
我们来看查询的效果
这个时候我们会发现,其他的列为空,这是为什么?因为左连接查询是以左表为主,左表有的信息全部查出来,没有就由空代表;
左表的字段
右表的字段
这个时候我们发现,左表有的值,右表没有,这个时候我们是左表为主,所以查不到的就以空代替。
我们来看查询
查询的时间:2.470ms(不加索引)
加索引的查询时间:1.160ms
总结:
1、左连接查询是以左表为主,如果右表没有的数据就用空代替;
2、在ON子句后面的字段加上索引,可以提高查询的效率;
右连接查询
左表字段(没有customer_id = 3的值)
右表字段:
总结:
1、右连接查询以右表为主,左表没有的值,就用空代替。
2、在ON后面的字段加上索引提高查询的效率;
联合查询
将两次查询的结果合并在一起。
我们再看一种场景,将两个查询的条件写成一样:
会将查询结果一样的合并在一起;
Union ALL
是不会合并一样的结果
总结:
1、联合查询就是将几个查询的结果合并在一起;
2、union查询会将查询结果一样的合并在一起,而union all是不会合并的;
3、union all的效率要比union的高,主要原因是union去重浪费一定的性能。