為什麼加了索引sql效能提高好幾倍?

2021-09-25 19:23:14 字數 1911 閱讀 6540

在我們日常開發中,針對mysql的sql優化,最簡單、最常用的方式就是為查詢條件加索引。那麼為什麼加個索引,sql的效能就能有明顯的提公升呢?這是因為針對沒有索引的sql語句,查詢是在磁碟中全表掃瞄過濾的,我們知道計算機中磁碟效能是最低的,相對於cpu和記憶體來說,慢的可不是一點半點。那麼索引中是怎麼查詢過濾的呢?索引中其實是採用了b+樹的方式,在記憶體中過濾完資料之後,才到磁碟中獲取具體的資料,相對於在磁碟中過濾來說,效能當然會提高很多。我們來看一下具體的索引過濾方式。

mysql中的不同儲存引擎的儲存方式是不同的,例如,在innodb引擎中使用的是聚簇索引,myisam使用的是非聚簇索引。關於聚簇索引和非聚簇索引的區別我們後面會說到,這裡主要說一下innodb中的索引。innodb索引型別有很多,大致分為兩大類,一種是主鍵索引,一種是普通索引。之所以分為這兩種,是因為他們在查詢過濾的過程中不太一樣。其他的索引後面會講到。

普通索引

如上圖所示,我們看到在普通索引中,索引是以b+樹的形式儲存的,先大概介紹下b+樹。b+樹的每個節點可以儲存多個元素,所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素(如圖中的2就是這樣)。b+樹中的每個元素不儲存資料指標,只用來索引,所有資料指標都儲存在葉子節點,同時葉子節點是以鍊錶的形式儲存的。在上圖中我們可以看出b+樹範圍查詢,只需要查詢到範圍初始最小節點的位置,然後在鍊錶中遍歷到最大節點的位置,即可拿到範圍資料。具體b+樹流程在這不做詳解,感興趣的可以自行看下資料。

所以使用b+樹的優點在於,所有的中間節點都是儲存的索引,只有葉子節點儲存的是資料的指標,所以,所以磁碟頁中可以儲存更多的節點元素,也就是說可以讓樹的高度變得更低,來減少io的次數。另外因為b+樹每次都要查詢到葉子節點來獲取指標,所以b+樹是穩定查詢。

我們了解完b+樹之後,可以看到普通索引中的儲存方式跟b+樹中不同的是,它的葉子節點中儲存的是主鍵id。拿到主鍵之後需要再去主鍵的b+樹中獲取到具體的資料資訊,這個過程我們稱之為回表。從這裡我們也可以看出,主鍵索引和普通索引的區別就在於不需要回表。如上圖。

為什麼要遵守最左字首原則

在上圖中,因為我們是name、age、***的組合索引,所以每乙個name、age、***是乙個節點。這個時候的排序方式就變成了從name開始排序,name排序完成的情況下再依次講age、***進行排序。比如是 2 、8 、5為乙個組合,5 、 3 、2為乙個組合,3 、 6 、5為乙個組合,這幾個組合是怎麼排序的呢?他們的排序順序為 2 、8 、5 --> 3 、6 、5 --> 5 、3 、2。這個時候我們發現其實它是首先按照第乙個字段排序的,在保證第乙個字段有序的情況下,再依次對後面的字段進行排序。

也就是說在建立聯合索引(a,b,c)的時候,只用(a,c)查的話,只能用到a的索引,無法用到c的索引,因為聯合索引的b+樹,首先是根據a來排序的,也就是說a是絕對有序的,b,c基本上是無序的。

我們先解答開篇,之所以加了索引之後sql語句的效率會提高,是因為索引的底層資料結構是b+樹。b+樹的中間節點都是儲存的索引,只有葉子節點儲存的是資料的指標(普通索引是儲存的id),所以,所以磁碟頁中可以儲存更多的節點元素,也就是說可以讓樹的高度變得更低,來減少io的次數。

另外我們還知道了innodb使用的是聚簇索引,myisam使用的是非聚簇索引。

聚簇索引又分為主鍵索引和輔助索引,主鍵索引的b+樹中的葉子節點是直接儲存的資料。輔助索引的b+樹葉子節點中儲存的是主鍵id。非聚簇索引b+樹的葉子節點中儲存的是資料的指標。

還有就是遵守最左字首原則是因為,b+樹中是從最左邊開始排序的,保證最左有序的情況下再依次對後面進行排序。所以無論什麼情況下最左都是有序的,要知道,b+樹本身就是需要有序才能成立,無序的資料是沒辦法獲取的哦!

Kafka 為什麼效能這麼好

1 利用partition可以實現並行處理 乙個topic的不同partition 不僅可以分配到不同的節點上,而且在同一節點上還可以置於不同的磁碟上。2 isr 實現 cap 中可用性於資料一致性的動態平衡 每個 topic 的每個 partition 都會有乙個 leader,和 followe...

為什麼索引可以提高查詢速度

參考 以下是關於索引的個人理解 有這麼乙個students表 我們執行一條sql語句 select from students where name 老頑童 執行結果 如果我們沒有為name欄位建立索引,這條sql語句是從頭開始一條一條比較的,比較七次 找到了老頑童所在的這一條資料。如果此時我們為n...

為什麼加了索引會快?資料變化B tree會怎麼變?

索引型別是btree 二叉樹 普通索引 單列索引 復合索引 組合索引 唯一索引 主鍵索引 全文索引 正是因為這個二叉樹演算法,讓查詢速度快很多,二叉樹的原理,就是取最中間的乙個數,然後把大於這個數的往右邊排,小於這個數的就向左排,每次減半,然後依次類推,每次減半,形成乙個樹狀結構圖。問 為什麼索引結...