MySql 連接查詢及 Explain關鍵字

1、連接查詢 ---------七種 JOIN

a LEFT JOIN b ON a.id = b.id 返回 a 表全部數據以及 a 表和 b 表有 相同id 的數據

 

a RIGHT JOIN b ON a.id = b.id 返回 b 表全部數據以及 b 表和 a 表有 相同id 的數據

 

a INNER JOIN b ON a.id = b.id 返回 a b 兩表 id相同 的數據

 

a LEFT JOIN B ON a.id = b.id where b.id is null 返回a表有而 b 表沒有的數據(a的獨有數據)

 

a RIGHT JOIN B ON a.id = b.id where a.id is null 返回 b 表有而 a 表沒有的數據(b的獨有數據)

 

a LEFT JOIN b ON a.id = b.id UNION a RIGHT JOIN b ON a.id = b.id

返回 a表 和 b 表 的共有數據 + a表的獨有數據 + b表的獨有數據

 

a LEFT JOIN b ON a.id = b.id where b.id is null UNION a RIGHT JOIN b ON a.id = b.id where a.id is null

返回 a 表的獨有數據 + b 表的獨有數據

 

 

2、索引( Index )

定義:幫助MySql高效獲取數據的 數據結構 ------ 排好序的快速查找數據結構

 

 

 

3、Sql優化

 

EXPLAIN:

id select查詢的***,包含一組數字,表示查詢中執行select字句或操作表的順序

id相同,執行順序由上而下

如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行

id如果相同,可以認爲是一組,從上往下順序執行;在所有組中,id值越大,優先級越高,越先執行

select_type

table

partitions

type 從最好到最差依次是: system > const > eq_ref > ref > range > index > ALL

system:表只有一行記錄(等於系統表),這是const類型的實例,平時不會出現,可以忽略不計

const:表示通過索引一次就找到了,const用於比較primary key或者unique索引。因爲只匹配一行數據,所以很快;

如將主鍵置於where列表中,MySql就能將該查詢轉換爲一個常量

eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃描。

ref:非唯一性索引掃描,返回匹配某個單獨值的所有行,會返回所有匹配的某個單獨值的行,可能會找到多個符合的行

range:只檢索給定範圍的行

index:全索引掃描,只掃描索引樹

ALL:全表掃描

 

possible_keys:顯示可能應用在這張表中的索引,一個或多個。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用

key:實際使用的索引。如果爲NULL,則沒有使用索引

key_len:表示索引中使用的字節數。在不損失精確度的情況下,長度越短越好。它顯示的值爲索引字段的最大可能長度,並非實際使用長度。

ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或常量被用於查找索引列上的值

rows:每張表有多少行被優化器查詢

Extra:包含不適合在其他列中顯示但十分重要的額外信息(只列出三個最重要的)

Using filesort:在使用 order by 進行排序時,如果沒有用到 建索引的字段進行排序,那MySql將進行一次對數據的排序。

Using temporary:產生了臨時表

Using index:使用了索引。直接返回索引對應的數據而不要在發起查詢的請求

 

 

4、利用索引對Sql進行優化

單表:查詢條件若爲範圍性的,索引會失效;所以索引應建立等於查詢的字段上;

 

兩表連接查詢:左查詢索引建立在右表,右查詢建立在左表;

 

三表連接查詢:永遠用小結果集驅動大的結果集; 保證被驅動表上join字段以及被索引

 

 

 

5、索引失效(應該避免)

 

10條索引失效常見原因

 

 

 

6、小表驅動大表

優化原則:小表驅動大表,即小的數據集驅動大的數據集

select * from A where id in (select id from B)

當B表的數據集必須小於A表的數據集時,用in 優於 exists

 

select * from A where exists (select 1 from B where B.id = A.id)

當A表的數據集小於B表的數據集時,用exists 優於 in

 

 

 

7、Order By字句排序優化