InnoDB引擎索引大觀

2021-12-29 21:44:32 字數 2152 閱讀 8186

innodb是mysql處理oltp(online transcation process)型別業務的儲存引擎。為了加快資料查詢速度,innodb引擎提供了豐富的索引實現。

索引可以分為聚集索引和非聚集索引,聚簇索引(cluster) index)是指索引中鍵值的邏輯順序和相應行的物理順序一致,簡單說就是索引中鍵值儲存的是對應的行資料。非聚簇索引中索引的鍵值中儲存的只是相應行的引用,並不代表行實際的儲存。索引是在資料庫的儲存引擎中實現,不同的儲存引擎索引的實現不一樣。舉例來說,你翻到新華字典的漢字「爬」那一頁就是p開頭的部分,這就是物理儲存順序(聚簇索引);而不用你到目錄,找到漢字「爬」所在的頁碼,然後根據頁碼找到這個字(非聚簇索引)[1]。

根據實現方式的不同,索引分為b+樹索引、雜湊索引、全文索引和空間樹索引。b/b+樹是實現索引常用的資料結構。它是乙個平衡的多叉查詢樹,從根節點到每乙個葉子節點的距離相等且樹的高度可控,因此能夠大幅度的減少查詢次數。雜湊是一種非常快的查詢方法,一般情況下查詢的時間複雜度為o(1),但是很多的資料庫系統如sql server、oracle並不支援雜湊索引。mysql的memory儲存引擎預設的儲存型別為雜湊。而在innodb資料庫引擎實現了一種自適應性雜湊索引。innodb引擎會監控對索引表上索引的查詢,如果觀察到建立雜湊索引可以帶來速度的有效提公升,則建立雜湊索引。自適應性索引通過緩衝池的b+樹構建而來,因此建立速度很快。全文索引是使用類似倒排索引的結構構造而成,mysql中可以在建表時指定fulltext到nchar,vchar,text型別性的字段上建立全文索引。

聚簇索引保證關鍵字的值相近的元組儲存的物理位置也相同(所以字串型別不宜建立聚簇索引,特別是隨機字串,會使得系統進行大量的移動操作),且乙個表只能有乙個聚簇索引。因為由儲存引擎實現索引,所以,並不是所有的引擎都支援聚簇索引。目前,只有soliddb和innodb支援。

葉子頁面包含完整的元組,而內節點頁面僅包含索引的列(索引的列為整型)。一些dbms允許使用者指定聚簇索引,但是mysql的儲存引擎到目前為止都不支援。innodb對主鍵建立聚簇索引。如果你不指定主鍵,innodb會用乙個具有唯一且非空值的索引來代替。如果不存在這樣的索引,innodb會定義乙個隱藏的主鍵,然後對其建立聚簇索引。一般來說,dbms都會以聚簇索引的形式來儲存實際的資料,它是其它二級索引的基礎。

myisam只支援非聚簇的索引,因此在談主鍵索引和輔助索引之間的區別的時候不能簡單的一概而論,比較合適的說法應該是這樣的:

索引的功能是在儲存引擎上存在的,不同的儲存引擎實現主鍵索引和輔助索引不同。在myisam儲存引擎中,主鍵索引和非逐漸索引都是非聚簇索引,葉子節點都是儲存對應資料行的引用。而在innodb中,主鍵索引是聚集索引,b+樹的葉子節點儲存是行資料。輔助索引是非聚集索引,索引b+樹葉子節點儲存的對應行的主鍵,通過主鍵索引可以找到相應的行。

另外innodb支援自適應雜湊索引,myisam支援全文索引。mysql 5.6以後的innodb儲存引擎也開始支援全文索引。

索引能夠減少查詢的次數,但是乙個錯誤的觀點是在每乙個可能的屬性上都建索引。索引的建立和調整過程會消耗資源。與索引對應的全表查詢,如果表中資料的數量很少建索引其實是不合適的。那什麼情況下使用索引才更有效呢?

b+樹索引使用的兩個原則:

1. 高選擇性

2. 結果集的數量很少的情況

如果某個字段取值範圍很廣(性別和地域字段就是乙個返利),幾乎沒有重複,即高選擇性,則此時使用b+樹索引是最合適的。

如果結果的數量很多通過b+樹索引一層層判斷的效能差於全表掃瞄。即使你在該列加了索引,優化器也不會使用索引,而是會使用全表掃瞄的方法。

對於第二種情況,優化器是怎麼判斷是不是應該使用索引的呢?優化器會通過explain的row欄位預估查詢可能得到的行,如果大於20%的行優化器會使用全表掃瞄的方法。

實際上,預估的返回行數的值是不準確的,因此優化器有時是不靠譜的。

如果我們能夠明確知道返回的結果集的大小,可以使用force index(index_col)強制使用索引。

b+樹索引失效實質是查詢不適用b+樹查詢的性質。常見的情況有:

(1)後項或者中間匹配,例如:使用like 『a%*』是可以使用索引,使用like 『%*a』 索引失效

(2)使用is not null或者<>

(3)在索引列上使用函式或者運算

(4)復合索引中where條件沒有使用到第一列,例如:where a=1或者where a=1 and b=2都會使用到索引,where b=2或者where a=1 or b=2索引失效.

MySql中InnoDB引擎索引

mysql中innodb引擎的索引分兩類,一類是一級索引 主鍵的同義詞 一類是二級索引 非主鍵的索引 兩類索引都使用b tree形式組織,但一級索引的葉子節點包含所以對應的整行資訊,所有的查詢最終都是通過一級索引完成,二級索引只包含二級索引對應的一級索引。所以直接使用一級索引比用二級索引快,因為少了...

InnoDB儲存引擎(四)索引

在本篇部落格中,我將介紹資料索引的原理 實現。innodb支援三種索引 聚集索引特點 聚集索引優點 非聚集索引特點 該值表示某個表的字段是否具有高選擇性,用來看是否應該建立索引。比如性別這種,是低選擇性的,取值範圍只有2個,而記錄有成千上萬條,為性別建立索引是沒有必要的。相反,如果取值範圍很大,ca...

MySql的InnoDB儲存引擎 索引

索引分類 1 聚集索引 索引順序與物理順序一致。mysql 的 innodb 中,主鍵索引就是聚集索引。好處是,進行搜尋的時候,因為索引和物理順序一致,所以找資料的時候更快。2 非聚集索引 索引順序與物理順序不一致。非主鍵索引。在非主鍵索引中,又有組合索引 最左索引 也就是查詢的時候如果where條...