join mysql 版本 MySql中的join

2021-10-17 21:15:19 字數 2658 閱讀 3907

建立表

create table `t2` (

`id` int(11) not null,

`a` int(11) default null,

`b` int(11) default null,

primary key (`id`),

key `a` (`a`)

) engine=innodb;

drop procedure idata;

delimiter ;;

create procedure idata()

begin

declare i int;

set i=1;

while(i<=1000)do

insert into t2 values(i, i, i);

set i=i+1;

end while;

end;;

delimiter ;

call idata();

create table t1 like t2;

insert into t1 (select * from t2 where id<=100)

演算法介紹index nested-loop join(nlj)

select * from t1 straight_join t2 on (t1.a=t2.a);執行過程

使用straight_join將t1表固定為驅動表,避免mysql優化器改變驅動表。上述sql執行過程如下:從表t1中讀入一行資料 r;

從資料行r中,取出a欄位到表t2裡去查詢;

取出表t2中滿足條件的行,跟r組成一行,作為結果集的一部分;

重複執行步驟1到3,直到表t1的末尾迴圈結束。

查詢t2表時使用到了t2的索引,稱為索引巢狀迴圈join。****** nest-loop join

select * from t1 straight_join t2 on (t1.a=t2.b);

上述sql中t2表沒有使用到索引,每次到t2中匹配時需要對t2做一次全表掃瞄。由於上述演算法太笨重,mysql對該演算法進行優化為blocknest-loop join。block nest-loop join

bnl演算法流程如下:將t1表中的資料全部取出放入執行緒記憶體join_buffer中;

掃瞄t2表,將t2中的每一條資料和join_buffer中的資料進行對比,滿足條件的資料作為結果集的一部分返回;bnl

block nest-loop join演算法時間複雜度和****** nest-loop join相同,但是記憶體操作,速度會比****** nest-loop join 快。join_buffer的大小是由引數join_buffer_size設定的,預設值是256k。如如果果放放不不下下表t1的所有資料的話,策略很簡單:分段放,取t2表中的資料對比後清空。分段即block

關於小表demo1

select * from t2 straight_join t1 on (t1.b=t2.b) where t2.id<=50;

join_buffer只需要放入t2的前50行,顯然是更好的。所以這裡「t2的前50行」是那個相對小的表,也就是「小表」。demo2

select t1.b,t2.* from t1 straight_join t2 on (t1.b=t2.b) where t2.id<=100;

select t1.b,t2.* from t2 straight_join t1 on (t1.b=t2.b) where t2.id<=100;

雖然t1和t2查詢數量都是小於100條,但是對於查詢1,join_buffer中只需要放入b值;對於查詢2需要放入id,a和b欄位。

驅動表應該是按照各自條件過濾,計算參與join各個欄位的總資料量,資料量小的表就是小表。

join優化multi-range read優化

了解mrr之前先熟悉一下回表的概念:innodb在普通索引查到主鍵id的值後,再根據主鍵id的值到主鍵索引上去查整行資料的過程。

回表操作是一條一條的到主鍵索引上查詢資料,並不是批量查詢。這就造成如果普通索引(非主鍵索引也被稱為二級索引secondary index)的值是遞增的話,查詢主鍵索引的id值就變成隨機的。如果能將主鍵索引的值調整為遞增順序的話就提公升效率。mrr設計思路根據索引a,定位到滿足條件的記錄,將id值放入read_rnd_buffer中;

將read_rnd_buffer中的id進行遞增排序;

排序後的id陣列,依次到主鍵id索引中查記錄,並作為結果返回。如果你想要穩定地使用mrr優化的話,需要設定setoptimizer_switch="mrr_cost_based=off"。(官方文件的說法,是現在的優化器策略,判斷消耗的時候,會更傾向於不使用mrr,把mrr_cost_based設定為off,就是固定使用mrr了。mrr執行過程batched key access

mysql在5.6版本後開始引入batched key acess(bka)演算法,該演算法是對nlj的優化。

nlj演算法執行的邏輯是:從驅動表t1,一行行地取出a的值,再到被驅動表t2去做join。對於表t2來說,每次都是匹配乙個值。這時,mrr的優勢就用不上了。

優化思路:先把錶t1的資料取出來一部分,先放到乙個臨時記憶體join_buffer中,然後再一次性的傳給t2。

開啟bka優化演算法:

set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';

mysql查詢學生join mysql

php join 函式獲取由陣列元素組合成的字串。本文章向碼農介紹php join 函式的使用方法和基本例項,感興趣的碼農可以參考一下。定義和用法join 函式返回由陣列元素組合成的字串。join 函式是 implode 函.需求分析 現有乙個引數需要根據這個引數 這個引數可能只有乙個表才有 查詢兩...

mysql多張表join MySQL多表查詢優化

相信這內連線,左連線什麼的大家都比較熟悉了,當然還有左外連線什麼的,基本用不上我就不貼出來了。這圖只是讓大家回憶一下,各種連線查詢。然後要告訴大家的是,需要根據查詢的情況,想好使用哪種連線方式效率更高。在mysql 中,只有一種join 演算法,就是大名鼎鼎的nested loop join,他沒有...

mysql多種join MySQL的幾種Join

左表t1 drop table if exists t1 create table t1 id int not null,name varchar 20 insert into t1 values 1,t1a insert into t1 values 2,t1b insert into t1 va...