Mysql查询

自然连接查询

通过上面的图我们注意到,自然连接的语法是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去重浪费一定的性能。

原文地址:https://www.cnblogs.com/liliuguang/p/9167890.html