首先說說mysql裡面索引的型別:
從資料結構角度
1、b+樹索引(o(log(n))):
2、hash索引:
a 僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢
b 其檢索效率非常高,索引的檢索可以一次定位,不像b-tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b-tree 索引
c 只有memory儲存引擎顯示支援hash索引
注意點:
mysql 常見儲存引擎 innodb 和 myisam 都不支援 hash 索引,它們預設的索引都是 b-tree。但是如果你在建立索引的時候定義其型別為 hash,mysql 並不會報錯,而且你通過 show create table 檢視該索引也是 hash,只不過通過
show indexes from發現
該索引實際上還是 b+ tree。
而innodb又比較高階,發現如果對於b+樹索引上如果建立hash索引能夠提高速度,就會建立hash索引來提公升效率。 這叫做自適應hash索引。
3、fulltext索引(現在myisam和innodb引擎都支援了)
4、r-tree索引(用於對gis資料型別建立spatial索引)
從物理儲存角度
1、聚集索引(clustered index)
2、非聚集索引(non-clustered index)
從邏輯角度
1、主鍵索引:主鍵索引是一種特殊的唯一索引,不允許有空值
2、普通索引或者單列索引
3、多列索引(復合索引):復合索引指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第乙個字段,索引才會被使用。使用復合索引時遵循最左字首集合
4、唯一索引或者非唯一索引
5、空間索引
另外關於索引的概念:稀疏索引 :對應檔案中搜尋碼的每乙個值都有乙個索引記錄(或索引項)。索引記錄包括搜尋碼值和指向具有該搜尋碼值的第乙個資料記錄的指標
稠密索引 : 與稠密索引相反,稀疏索引只為搜尋碼的某些值建立索引記錄
由於針對資料庫來說,查詢的主要開銷是將資料塊從磁碟之中讀入到記憶體之中(按照塊為單位),那麼一旦將乙個資料塊放入記憶體之後,掃瞄這個資料塊的時間是可以忽略的。因此資料庫更加適合使用稀疏索引。
innodb引擎中,
乙個聚集索引是必須的,如果沒有定義主鍵,innodb首先會找乙個唯一索引來做聚簇索引,如果無法找到這樣的唯一索引,innodb也會自己隱含的建立乙個聚集索引作為主鍵,因為innodb的主鍵索引還有個重要的功能就是行鎖。
innodb的主鍵索引包含了行的全部資訊,索引key是主鍵值,索引value是整行的值。而非主鍵索引索引key是列值,索引value是主鍵值,需要注意的是這裡的value值並不是行的實體地址值。因此從非聚簇索引取資料,需要至少兩次記憶體操作,第一次從非聚簇索引取得主鍵的值,然後通過主鍵的值取聚簇索引中尋找對應的行,從而獲取行的資料。
MySQL InnoDB 的索引模型(B 樹)
目錄一 innodb 的索引模型 二 索引維護 三 mysql innodb索引二次查詢解決方案 3.1 為什麼會造成二級查詢 3.2 解決方案 3.2.1 索引覆蓋 3.2.2 延時關聯 四 小結 在 mysql 中,索引是在儲存引擎層實現的,所以並沒有統一的索引標準,即不同儲存引擎的索引的工作方...
MySQL InnoDB引擎B 樹索引簡單整理說明
本文出處 mysql中的innodb引擎表索引型別有一下幾種 以下所說的索引,沒有特殊說明,均指innodb引擎表索引。0 secondary index,二級索引,1 clustered index,聚集索引 2 unique index,唯一索引 3 primary index,主鍵索引 32 ...
Mysql InnoDB 為啥選擇B 樹索引 一
mysql資料庫中的常見索引有多種方式,例如hash索引,b 樹索引,b 樹索引,但是為啥mysql中預設是採用b 樹索引索引呢?下面對這三種索引學習總結一下。b 樹到底有啥優勢?b 樹有如下特點 所有鍵值分布在整顆樹中 任何乙個關鍵字出現且只出現在乙個結點中 搜尋有可能在非葉子結點結束 在關鍵字全...