MySQL的JOIN(二) JOIN原理

2022-04-06 16:11:17 字數 1559 閱讀 8787

nested loop join(nlj)演算法:

首先介紹一種基礎演算法:nlj,巢狀迴圈演算法。迴圈外層是驅動表,循壞內層是被驅動表。驅動表會驅動被驅動表進行連線操作。首先驅動表找到第一條記錄,然後從頭掃瞄被驅動表,逐一查詢與驅動表第一條記錄匹配的記錄然後連線起來形成結果表中的一條記。被驅動表查詢完後,再從驅動表中取出第二個記錄,然後從頭掃瞄被驅動表,逐一查詢與驅動表第二條記錄匹配的記錄,連線起來形成結果表中的一條記錄。重複上述操作,直到驅動表的全部記錄都處理完畢為止。這就是巢狀迴圈連線演算法的基本思想,偽**如下。

foreach row1 from t1

foreach row2 from t2

if row2 match row1 //

row2與row1匹配,滿足連線條件

join row1 and row2 into result //

連線row1和row2加入結果集

首先載入t1,然後從t1中取出第一條記錄,之後載入t2表,與t2表中的記錄逐個匹配,連線匹配的記錄。

block nested loop join(bnlj)演算法:

再介紹一種高階演算法:bnlj,塊巢狀迴圈演算法,可以看作對nlj的優化。大致思想就是建立乙個快取區,一次從驅動表中取多條記錄,然後掃瞄被驅動表,被驅動表的每一條記錄都嘗試與緩衝區中的多條記錄匹配,如果匹配則連線並加入結果集。緩衝區越大,驅動表一次取出的記錄就越多。這個演算法的優化思路就是減少內迴圈的次數從而提高表連線效率。

1.內迴圈的次數:現在考慮這麼乙個場景,當t1有100條記錄,t2有10000條記錄。那麼,t1驅動t2與t2驅動t1,他們之間在效率上孰優孰劣?如果是單純的分析指令執行次數,他們都是100*10000,但是考慮到載入表的次數呢。首先分析t1驅動t2,t1表載入1次,t2表需要載入100次。然後分析t2驅動t1,t2表首先載入1次,但是t1表要載入10000次。所以,t1驅動t2的效率要優於t2驅動t1的效率。由此得出,小表驅動大表能夠減少內迴圈的次數從而提高連線效率。

另外,如果使用block nested loop join演算法的話,通過擴大一次快取區的大小也能減小內迴圈的次數。由此又可得,設定合理的緩衝區大小能夠提高連線效率

2.快速匹配:掃瞄被驅動表尋找合適的記錄可以看做乙個查詢操作,如何提高查詢的效率呢?建索引啊!由此還可得出,在被驅動表建立索引能夠提高連線效率

3.排序:假設t1表驅動t2表進行連線操作,連線條件是t1.id=t2.id,而且要求查詢結果對id排序。現在有兩種選擇,方式一[...order

by t1.id],方式二[...order by

t2.id]。如果我們使用方式一的話,可以先對t1進行排序然後執行表連線演算法,如果我們使用方式二的話,只能在執行表連線演算法後,對結果集進行排序(using temporary),效率自然低下。由此最後可得出,優先選擇驅動表的屬性進行排序能夠提高連線效率。

《資料庫系統概論》

MySQL高階知識(二) Join查詢

前言 該篇主要對mysql中join語句的七種情況進行總結。join主要根據兩表或多表之間列的關係,從這些表中進行資料的查詢。1.tb emp表。drop table if exists tb emp create table tb emp id int 11 not null auto incre...

(十三)Join原理,Join優化

聯結兩個表時,如果第二個表上有聯結鍵索引,那麼就會根據第乙個表中查出的聯結鍵值搜尋索引,然後根據索引得到的主鍵id去第二張表找 在這種情況下 使用 join 語句,效能比強行拆成多個單錶執行 sql 語句的效能要好 如果使用 join 語句的話,需要讓小表做驅動表。聯結兩個表時,如果第二個表上沒有聯...

MySQL 表的關聯join

目錄 1 left join 2 right join 3 inner join 4 full outer join oracle mysql通過join實現表的關聯,關聯方式主要有三種。有兩個表用於下面的測試 select from test select from test2 結果分別為 lef...