关于使用多表联查代替LEFT JOIN 的使用方案

前言

还记得,我们在刚刚开始学习MYSQL的时候,我们的老师或多或少都对我们说。MYSQL尽量不要去使用多表联查。

但是,理由呢?我们学习的过程之中,不应该仅仅只是去听 ,更应该自己思考。

我认为任何事情既然其存在必有其存在的含义。因此,我们不应该连考虑都不进行考虑就进行对其的否定。我们也应该勇敢的进行适当的尝试。

当然了,这并不是对自己的东西完全的肯定,对他人的完全否定。

这下面的内容,也仅仅只是一个使用方案罢了

问题


假设我们有两张表,一张记录商品信息,另一张商品类型,二者的关系是根据商品表之中记载的商品类型的主键来确定。二者的SQL 查询 语句如下


SELECT shop_id , shop_name , shop_type_id FROM shop ; //查询商品表

SELECT shop_type_id , shop_type_name FROM shop_type; //查询商品类型

那我们如何对其进行联合查询操作呢?
主要的操作,我目前只能列举出以下几种(当然了,如果你有更好的方案也可以提出,学习嘛~)

// LEFT JOIN 查询
SELEFT s.shop_id,s.shop_name,st.shop_type_id,st.shop_type_name FROM shop s 
LEFT JOIN shop_type st ON s.shop_type_id = st.shop_type_id 

//多次查询
SELECT shop_id , shop_name , shop_type_id FROM shop ;
//之后利用 shop_type_id 来进行查询
SELECT shop_type_id , shop_type_name FROM shop_type; 

两种方案各有各的好处,甚至他们的优缺点是相互互补的
1.查询次数少,查询资源浪费大
2.查询次数多,查询资源浪费少

上面两种,便是我们平常经常使用的方法。但是,现在倘若我们需要 shop_type_name 这个关系表内的属性值来进行查询呢?

那么首先,第二种的多次查询方案,就不得不废弃了,并且其SQL语句也被更改为:


SELEFT s.shop_id,s.shop_name,st.shop_type_id,st.shop_type_name FROM shop s LEFT JOIN
(SELECT st.shop_type_id , st.shop_type_name FROM shop_type st WHERE st.shop_type_name LIKE '%xxxx%' ) st 
ON s.shop_type_id = st.shop_type_id WHERE (XXXXX 'S的查询条件') AND st.shop_type_name LIKE '%xxxx%'

如此的方案的确可行,但是执行速率却并不是十分的乐观。
当前的环境,十万条数据,无索引。
虽然我们之前的学习可以知道,索引才是导致问题发生的主要原因。
但是,这样的结果并不是能让人忍受的。

å¨è¿éæå¥å¾çæè¿°

双表联查方案

因此,就是出于这样的目的,所以我想试一试双表联查。

但是施行不久,首先我们会先遇见一个挫折,s.shop_type_id 拥有空的状态,便是 s.shop_type_id 等于0 ,当结果等于此时,表示shop 并无类型

但是,双表联查的主要概念,便是查询两张表之间的交集。因此,当进行双表联查的时候,会自动忽略 那些 type_id 为 0的 字段。

因此,为了解决这个方案,我就在 shop_type_id 加上这么一个无意义的 id 为0的字段,便可以轻松解决这个问题。

这样,我们的SQL 查询语句便成功诞生了。

	SELEFT s.shop_id,s.shop_name,st.shop_type_id,st.shop_type_name FROM shop s ,shop_type st
	where  s.shop_type_id = st.shop_type_id AND (S 查询条件) AND st.shop_type_id = s.shop_type_id

å¨è¿éæå¥å¾çæè¿°

结果会比上 LEFT JOIN 快上一些,但却不知道加上索引,速率是否能让人接受。

二者的优势与劣势

当然了,任何东西都是有利有弊,我们现在分析一下二者的问题所在

LEFT JOIN 最大的问题便是需要自己查询一次,那么我们不难发现,当 LEFT JOIN 内部的条件越少时,自然而然,查询的速度就越慢,条件越多,查询速率就越快。也就是如此。

双表联查呢?就很简单,二者融合建立虚拟表,速度自然而然会快很多,但是我们不难想象所占内存自然而然也会跟多,

它是将两张数据表进行富裕整合,查询的数列为 m 的n 次方,因此,如果条件越复制,速度自然而然也越慢,因为需要过的行数自然而然也越多。
 

转载:会喷火才能叫火山 - 关于使用多表联查代替LEFT JOIN 的使用方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值