# mysql 索引1

這是我參與8月更文挑戰的第7天,活動詳情查看:8月更文挑戰數據庫

概述

索引的出現是爲了提升數據的查詢效率,就像書的目錄同樣。一本500頁的書,若是你想快速找到其中的某一個知識點,在不借助目錄的狀況下,那我估計你可得找一下子。一樣,對於數據庫的表而言,索引其實就是它的「目錄」。markdown

一樣索引也會帶來不少負面影響:建立索引和維護索引須要耗費時間,這個時間隨着數據量的增長而增長;索引須要佔用物理空間,不光是表須要佔用數據空間,每一個索引也須要佔用物理空間;當對錶進行增、刪、改、的時候索引也要動態維護,這樣就下降了數據的維護速度。數據結構

創建索引的原則:

  1. 在最頻繁使用的、用以縮小查詢範圍的字段上創建索引;
  2. 在頻繁使用的、須要排序的字段上創建索引。

不適合創建索引的狀況:

  1. 對於查詢中不多涉及的列或者重複值比較多的列,不宜創建索引;
  2. 對於一些特殊的數據類型,不宜創建索引,好比:文本字段(text)等。

索引底層的數據結構

索引的數據結構和具體存儲引擎的實現有關,,在MySQL中使用較多的索引有 Hash 索引、B+樹索引等。而咱們常常使用的 InnoDB 存儲引擎的默認索引實現爲 B+ 樹索引。post

B+ 數

  1. B+ 樹是基於 B 樹和葉子節點順序訪問指針進行實現,它具備 B 樹的平衡性,而且經過順序訪問指針來提升區間查詢的性能。
  2. 在 B+ 樹中,一個節點中的 key 從左到右非遞減排列,若是某個指針的左右相鄰 key 分別是 key i 和 key i+1,且不爲 null,則該指針指向節點的全部 key 大於等於 key i 且小於等於 key i+1。
  3. 進行查找操做時,首先在根節點進行二分查找,找到一個 key 所在的指針,而後遞歸地在指針所指向的節點進行查找。直到查找到葉子節點,而後在葉子節點上進行二分查找,找出 key 所對應的 data。
  4. 插入、刪除操做會破壞平衡樹的平衡性,所以在插入刪除操做以後,須要對樹進行一個分裂、合併、旋轉等操做來維護平衡性。

B+樹與B樹

用 B+ 樹不用 B 樹考慮的是 IO 對性能的影響,B 樹的每一個節點都存儲數據,而 B+ 樹只有葉子節點才存儲數據,因此查找相同數據量的狀況下,B 樹的高度更高,IO 更頻繁。數據庫索引是存儲在磁盤上的,當數據量大時,就不能把整個索引所有加載到內存了,只能逐一加載每個磁盤頁(對應索引樹的節點)。性能

相關文章
相關標籤/搜索