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字句排序優化