本文出處:
mysql中的innodb引擎表索引型別有一下幾種(以下所說的索引,沒有特殊說明,均指innodb引擎表索引。)
0 = secondary index,二級索引,
1 = clustered index,聚集索引
2 = unique index,唯一索引
3 = primary index,主鍵索引
32 = full-text index,全文索引
64 = spatial index,空間索引
128 = a secondary index that includes a virtual generated column.二級計算列索引。
其中二級索引,聚集索引,唯一索引,主鍵索引,二級計算列索引,按照邏輯儲存結構來看,都是b+樹來儲存的
這一點與其他資料庫的b+樹索引邏輯儲存結構上看,並沒有太大的不同,以上幾種索引都是從邏輯角度來劃分的。
如果從物理儲存角度來看,mysql中的這幾類索引可以劃分為聚集索引和二級索引(或者叫非聚集索引)
其中,主鍵索引和聚集索引,可以歸類為聚集索引,二級索引,唯一索引,二級計算列索引都資料非聚集索引。
mysql中的聚集索引
mysql聚集索引就是根據主鍵,把整張表的資料,在邏輯上組織成一棵b+樹,因此乙個表只能由乙個聚集索引。
非葉子節點儲存聚集索引key值,葉子節點儲存表中的資料本身,葉子節點與葉子節點之間採用雙向鍊錶的方式連線在一起。
了解mysql的聚集索引之前,先了解一下mysql主鍵生成機制。
mysql的innodb必須有乙個主鍵,
如果在建表的時候指定了主鍵,那麼這個主鍵就是該錶的主鍵(聽起來這麼彆扭,主要是跟未指定主鍵的情況下,自動生成的額主鍵作對比)
如果在建表的時候沒有指定主鍵,那麼儲存引擎會自動為表上建乙個主鍵列
1)對於指定了主鍵的表,主鍵生成的索引就是「主鍵索引」,
2)對於未指定主鍵的表,如果有(乙個或者多個)非空的唯一索引,(第乙個)非空唯一約束做主鍵
3)對於未指定主鍵的表,且沒有唯一約束的表,預設生成乙個主鍵,該主鍵上生成的索引就是「聚集索引」,
實際上,前者的「主鍵索引」和後者的「聚集索引」,物理儲存上都可以歸屬為聚集索引
1,顯式主鍵索引(聚集索引)
如下截圖,建立了test_index_type_1
在建表的時候指定了主鍵,則主鍵預設生成主鍵索引,索引型別是3(從物理儲存角度看,是聚集索引)
在表建立完成之後建立了索引,生成的是二級索引,索引型別是0(從物理儲存角度看,是非聚集索引)
2,非空唯一約束生成的主鍵索引(聚集索引)
如下截圖,建立了test_index_type_2,
在建表的時候沒有指定了主鍵,但是指定了乙個唯一的非空約束,那麼這個欄位會當做主鍵用,生成的索引型別是3(從物理儲存角度看,是聚集索引)
3,系統預設主鍵生成的聚集索引(聚集索引)
如下截圖,建立了test_index_type_3表,
在建表的時候沒有指定了主鍵,也沒有指定唯一的非空約束,innodb引擎會自動生成乙個6位元組的指標,生成的索引型別是聚集索引,型別是1(從物理儲存角度看,是聚集索引)
非聚集索引
非聚集索引,非聚集索引同樣是b+樹的結構來儲存資料的,
與聚集索引做大的差異在於非聚集索的葉子節點儲存的僅僅是索引的key值+聚集索引的key值,但是不包括所有的非索引鍵值。
1,唯一索引約束生成的唯一索引(非聚集索引)
如下截圖,建立了test_index_type_4表,
指定了id為unique的,那麼會自動在id列上建立乙個唯一索引。
2,手動建立的唯一索引(非聚集索引)
如下截圖,建立了test_index_type5表,
手動在建立乙個唯一的索引,那麼這個索引型別為唯一索引
3,手動建立的二級索引(非聚集索引)
如下截圖,建立了test_index_type6表,
那手動在建立乙個的索引(未指定unique),那麼這個索引型別為二級索引
4,計算列索引,在計算列上手動建立索引(非聚集索引)
如下截圖,建立了test_index_type7表,
test_index_type7上有乙個計算列,建立完成之後在計算列上加索引,索引為計算列索引
總結:整體上來看,mysql的幾種型別的b+樹的索引還是比較容易理解的,跟sql server中的索引也比較類似。
mysql的innodb引擎表中,主鍵索引,非空唯一約束生成的聚集索引,聚集索引,從物理儲存上看都資料聚集索引。
主鍵索引,非空唯一約束生成的聚集索引,聚集索引,三者有乙個明顯的特點,都要求所在的列是非空且唯一的。
另外就是mysql無法顯式建立聚集索引,也即create clustered index.
這一點與sql server有很大的不同,
1,在sql server中,如果沒有指定主鍵,或者指定了主鍵沒有但是指定為nonclustered,那麼表就是為堆表,系統不會新增預設字段作為聚集索引
2,sql server的主鍵可以僅僅是主鍵,可以不是聚集索引(預設情況下主鍵是聚集索引)。
聚集索引可以指定在任意乙個列上,可以是非主鍵列,可以是非唯一,可為null,可重複的列,比如如下
MySQL InnoDB儲存引擎的B 樹索引演算法
很早之前,就從學校的圖書館借了mysql技術內幕,innodb儲存引擎這本書,但一直草草閱讀,做的筆記也有些凌亂,趁著現在大四了,課程稍微少了一點,整理一下筆記,按照專題寫一些,加深一下印象,不枉讀了一遍書。與此同時,也加深一下對mysql的了解,認識了原理,對優化的原則才有把握,對問題的分析才有源...
MySQL innodb 索引 B 樹實現
首先說說mysql裡面索引的型別 從資料結構角度 1 b 樹索引 o log n 2 hash索引 a 僅僅能滿足 in 和 查詢,不能使用範圍查詢 b 其檢索效率非常高,索引的檢索可以一次定位,不像b tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引...
MySQL InnoDB 的索引模型(B 樹)
目錄一 innodb 的索引模型 二 索引維護 三 mysql innodb索引二次查詢解決方案 3.1 為什麼會造成二級查詢 3.2 解決方案 3.2.1 索引覆蓋 3.2.2 延時關聯 四 小結 在 mysql 中,索引是在儲存引擎層實現的,所以並沒有統一的索引標準,即不同儲存引擎的索引的工作方...