還記得,我們在剛剛開始學習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
'%***x%'
) st
on s.shop_type_id = st.shop_type_id where
(***xx 's的查詢條件'
)and st.shop_type_name like
'%***x%'
如此的方案的確可行,但是執行速率卻並不是十分的樂觀。
當前的環境,十萬條資料,無索引。
雖然我們之前的學習可以知道,索引才是導致問題發生的主要原因。
但是,這樣的結果並不是能讓人忍受的
因此,就是出於這樣的目的,所以我想試一試雙表聯查。
但是施行不久,首先我們會先遇見乙個挫折,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 查詢條件)
結果會比上 left join 快上一些,但卻不知道加上索引,速率是否能讓人接受
當然了,任何東西都是有利有弊,我們現在分析一下二者的問題所在
left join 最大的問題便是需要自己查詢一次,那麼我們不難發現,當 left join 內部的條件越少時,自然而然,查詢的速度就越慢,條件越多,查詢速率就越快。也就是如此。
雙表聯查呢?就很簡單,二者融合建立虛擬表,速度自然而然會快很多,但是我們不難想象所佔記憶體自然而然也會跟多,
它是將兩張資料表進行富裕整合,查詢的數列為 m 的n 次方,因此,如果條件越複製,速度自然而然也越慢,因為需要過的行數自然而然也越多
關於多表的leftJoin
建立表結構如下 create table x.a a1 int,a2 varchar 10 create table x.b b1 int,b2 varchar 10 create table x.c c1 int,c2 varchar 10 insert into x.a values 1 hah...
如何使用LEFT JOIN實現多表查詢
什麼是left join請各位自行了解,廢話不多說,先直接上三張表 組織表 t organization 部門表 t department 使用者表 t user 邏輯是組織下面有部門,部門下面有使用者,組織和部門通過organization id欄位關聯,部門和使用者通過department id...
SQL優化 使用關聯查詢代替子查詢
sql優化 使用關聯查詢代替子查詢 測試例子 子查詢 selecta.select workflowname from workflowbase whereid workflowid workflowname from zping.com a where a.operator 402882ed111...