Mysql索引簡單介紹

最近在學習mysql索引知識,簡單整理!------------------------------

1.什麼是索引(內容來源網絡)

索引用於快速找出在某個列中有一特定值的行。不使用索引,MySQL必須從第1條記錄開始然後讀完整個表直到找出相關的行。
表越大,花費的時間越多。如果表中查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到數據文件的中間,沒有必要看所有數據。
大多數MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)在B樹中存儲

2.我們着重聊一下B+樹索引,如下圖

圖中涉及兩種類型的索引:聚簇索引、非聚簇索引

2.1聚簇索引:

一般就是主鍵索引,該索引中每個子節點都保持主鍵的範圍值,葉子節點保存單行數據的所以字段,因此當我們利      用主鍵索引去檢索一定可以檢索到我們所需數據,不需要去其他地方獲取值;

  注意:每個表只能有一個聚簇索引

2.2 非聚簇索引:

除主鍵索引以外的索引類型,和聚簇索引最大差異在於葉子節點保存的不是完整數據,而是某個非主鍵列和主鍵,非侷促索引可能帶來"回表",這裏引入回表的概念,我們稍後介紹;

2.3 我們具體說明回表:

假如我們table1表中有三個字段A,B,C,D  現在建立聯合索引 index1(B,C)

當我們執行 select  * from table1 where B=1 and C=1;這段執行之後無疑index1索引,但是需要返回的是*,也就是A,B,C,D,根據前面介紹,非聚簇索引葉子節點之後保存索引中的字段值和key,因此還需要根據key值去聚簇索引中查詢A,D字段的值,此過程叫做回表

回錶帶來的問題就是增加了檢索的複雜度,也就帶來時間上面的開銷;

既然知道回錶帶來的額外開銷,那我們如何儘量避免回表呢?下面引入覆蓋索引的概念

2.4 覆蓋索引

首先覆蓋索引要儘量避免使用 select * 這個的檢索語句,比如依舊使用上面的例子select  * from table1 where B=1 and C=1;

這時候如果我們select  B C  from table1 where B=1 and C=1;這樣檢索的字段都包含在索引中,我們可以從葉子中找到字段數據,避免了回表過程(這只是一個栗子)

 

3 介紹完索引類型我們介紹下什麼情況下索引生效或失效(開局一張圖)

首先介紹聯合索引,我們要知道,聯合索引遵循最左側原則,也就是當建立A,B,C聯合索引,能使用索引的條件

有A/AB/ABC(ABC可以是無序的,因爲mysql會幫我們自動重排序);

根據上圖其實A字段就是最上面的節點範圍值,當檢索完A之後纔去檢索B(步驟和A一樣需要排序),之後是C,這樣假設

檢索的是AC,那將會只有A走了索引,B出現了斷點,根據最左側原則,C也不會再進行索引;

 

3.1結果分析

通過上面的例子我們分析如下查詢語句( index1(B,C))

select  B C  from table1 where B=1 and C !=1;

分析:當我們執行語句過程中,B字段無疑可以進行索引,但是當走到C字段檢索時,發現沒有給出具體範圍值,這樣你讓索引如何去檢索,因此C字段無法執行索引;

再去通過上面的說明分析 !=,<>,is null,is not null這樣的操作,都沒有指出字段範圍,怎麼可能去走索引呢;

 

3.2.覆蓋索引一般不會去全表掃描

在上述表達中,覆蓋索引算是極端,即使index (a,b,c) where b = and c= 或者 where b =or c=

因爲他會遍歷覆蓋索引的二級索引,不用去掃描聚集索引(但是索引效率不是很高)

 

因此有些定義不能死記硬背,需要我們去理解掌握

 

發佈了21 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章