mysql查询2_Mysql查询二

自然连接查询

5e47a5e88ee82ba9f6887dc2eed3cbe8.png

通过上面的图我们注意到,自然连接的语法是JOIN  ON,as 后面就是对应表和字段的别名,JOIN后面是连接的表,ON后面是连接的条件。

我们查询的数据量是16000条,我们使用表的引擎是MYISAM。

我们来看这次查询的时间是:4.527ms(这个查询是简单查询,没有加索引)

1415495-20180611141757296-38578997.png

我们给ON条件的字段加索引,查询的时间是:3.507ms

1415495-20180611142121811-1009585985.png

我们在后面建立了一个复合索引

2711c776fc6bba3f2f52cb79c466216c.png

我们再看另一个场景,只出现staff_id和rental_id情景:

177ca969809a963da1199ca02d62c3cc.png

查询时间是:3.219ms

c3211f70bf2184f9e0a98a10a911048d.png

我们现在把三个字段都加上

fc7f00321b4bec254b5d7d677a9af853.png

3a08262d0b3765eae3bdbd1b603fa0b5.png

查询的时间是:1.954ms

为什么会这么神奇,代码就相差一个字段,查询的时间差就很大呢?我来解释一下:我们创建的复合索引,如果让索引生效就要从左向右一次出现对应的字段,不能有空,比如123,你写的是13中间隔了一个,索引就失效。还有一种情况12索引也是生效。因为索引没有生效才会出现这种情况。

我们来看一下子查询

8cf629953fbb642fd26b905d5dc6984e.png

所用时间:7.126ms

ae4b851d6e8f3335075a2b4e169416a3.png

把他转化成自然连接

7d54c976cfffe0519773c2ef8a4e3593.png

所用时间:1.160ms

10ac61f202f51f20eaee59bd25d62108.png

总结:

1、我们要给自然连接查ON后面的字段加索引来提高查询的效率,注意如果是复合索引,那么我们查询字段顺序一定是按照复合索引从左向右的顺序。

2、我们对比了子查询和自然连接查询,他们相差还是很大的,优化的办法就是我们把子查询转换成自然连接查询。

3、自然连接查询多的时候一定要要给表和字段起别名,为了方便后面查询。如果不这样做就是表名加字段,太长了。SQl语句看起来很乱。

左连接查询

a915aa126b719e251704dde4a988c695.png

我们来看查询的效果

13cec8e6f6c6967c09d231f68f248bb1.png

这个时候我们会发现,其他的列为空,这是为什么?因为左连接查询是以左表为主,左表有的信息全部查出来,没有就由空代表;

左表的字段

e76bcef877657921ee30f85d36d35540.png

右表的字段

fddf390733dc0da3cc9e29a1bcf0f0e6.png

这个时候我们发现,左表有的值,右表没有,这个时候我们是左表为主,所以查不到的就以空代替。

我们来看查询

1a890c5e0b62fe5527448512a8e57288.png

查询的时间:2.470ms(不加索引)

5161d46c24ffdada6897073fe87f28de.png

加索引的查询时间:1.160ms

098345b021829f07b4cd7eb9fd4a1cb0.png

总结:

1、左连接查询是以左表为主,如果右表没有的数据就用空代替;

2、在ON子句后面的字段加上索引,可以提高查询的效率;

右连接查询

f1b7fc9aa46fb268674083ca0ad91836.png

左表字段(没有customer_id = 3的值)

e5322693c808e9bcb1de9b44880bd6c4.png

右表字段:

f20f9223192d7d113ebf9d1620f8c2ea.png

总结:

1、右连接查询以右表为主,左表没有的值,就用空代替。

2、在ON后面的字段加上索引提高查询的效率;

联合查询

6f34308af5909659dfef6dda9fb14cc0.png

将两次查询的结果合并在一起。

e535ef541072f887972f1bd14f424827.png

我们再看一种场景,将两个查询的条件写成一样:

df07907d142467d355196574f3b905c1.png

会将查询结果一样的合并在一起;

f7b6fb2a0917dc4089b2a290aeb3d0de.png

Union ALL

44bd49d95dc33666a5b356809d0f2acc.png

是不会合并一样的结果

fda6f2a45e529a25c0da873873b4f1cf.png

总结:

1、联合查询就是将几个查询的结果合并在一起;

2、union查询会将查询结果一样的合并在一起,而union all是不会合并的;

3、union all的效率要比union的高,主要原因是union去重浪费一定的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值