您當前的位置:首頁 > 書法

快速理解索引原理

作者:由 勤勞的小手 發表于 書法時間:2017-07-10

1、什麼是索引

索引是一種利用某種規則的資料結構與實際資料的關係加快資料查詢的功能;索引資料節點中有著實際檔案的位置,因為索引是根據特定的規則和演算法構建的,在查詢的時候遵循索引的規則可以快速查詢到對應資料的節點,從而達到快速查詢資料的效果;其實宏觀來說索引其實是一種概念而不是具體的某項技術,只是我們在某個技術中運用得比較廣泛和鮮明(比如說資料庫)漸漸的有了特定領域的標籤,其實在生活中索引的使用無處不在,比如說:書本里的目錄;讀書時的座位號,考試編號都有類似索引的功能;

總結來所有透過某規則資料結構和實際目標關聯,根據特定規則演算法快速定址的功能都可以稱之為索引;

2、為什麼要用索引,以及索引的原理

首先我們看下在沒有索引的情況下是怎麼查詢資料的:

我們用一個例子來解釋比較直觀

(1)沒有索引的情況下訪問資料:

快速理解索引原理

快速理解索引原理

(2)使用平衡二叉樹結構(請看推薦資料)索引的情況下訪問資料:

快速理解索引原理

快速理解索引原理

第一張圖沒有使用索引我們會進行順序查詢,依照資料順序逐個進行匹配,進行了5次定址才查詢出所需資料,第二張圖用了一個簡單的平衡二叉樹索引之後我們只用了3次,這還是資料量小的情況下,資料量大了效果更明顯,所以總結來說建立索引就是為了加快資料查詢速度;

3、主要種類

(1)索引結構上主要分為聚簇索引和非聚簇索引,聚簇索引是指索引的結構和排列規則是和實際資料的儲存結構和排列規則是一樣的(比如說書本的目錄和內容就相當於聚簇索引,書本的內容順序總是和目錄順序一樣的),每個表至多隻能建立一個聚簇索引,下圖為聚簇索引的一種結構表示;

快速理解索引原理

快速理解索引原理

(2)非聚簇索引則可能是透過其他演算法規則構成的一種索引結構,索引的結構和實際資料儲存的結構是不同的,比如說這張圖中的索引型別就屬於非聚簇索引;

快速理解索引原理

快速理解索引原理

4、索引按資料庫功能分類

(1)唯一索引

概念:唯一索引限制了在表對應的唯一索引列上的值是唯一不可重複的;

特點:

1>一個表可以建立多個唯一索引;

2>唯一索引的值允許為null;

3>允許多個列建立組合唯一索引;

(2)主鍵索引

概念:主鍵索引屬於唯一索引的一個特殊種類,一個表的某列建立了主鍵索引後會具備唯一索引的功能同時還會對該列生成主鍵約束,所以簡單來說主鍵索引是一種帶有主鍵約束的唯一索引;

特點:

1>資料庫在建立主鍵同時會自動建立一個唯一索引。

2>每個表最多隻能建立一個主鍵索引;

3>建立了主鍵索引的列不允許有重複的值,並且不能為null值;

4>建立了主鍵索引的列可以作為外來鍵;

(3)聚集索引

概念:聚集索引屬於聚簇索引的一個種類,在mysql中InnoDB資料引擎模式主索引就是使用的聚集索引,聚集索引的索引結構中就包含了表的資料;

特點:

1>一個表只能建立一個聚集索引;

2>聚集索引儘量建在不會經常發生變動的列上,因為一旦列變動同時也會引索引結構變化,而索引結構中也包含者資料的變動;

3>資料庫在建立主鍵時如果這個表之前沒有聚集索引,同時建立主鍵時候沒有強制指定使用非聚集索引,則建立主鍵時候,同時建立一個唯一的聚集索引

5、什麼時候不要用索引,什麼時候要用索引

(1)什麼場景不要用索引:

1>資料更新效能比查詢效能要求要高的情況下不要使用索引,因為資料的更新的同時索引也要進行維護和更新(加了索引查詢快但更新就會慢);

2>不要盲目的給表建太多索引,因為索引本身的儲存也要佔用儲存空間,一旦更新操作頻繁反而降低新效能;

3>不要給不經常使用的列建索引,不怎麼查詢還建索引幹嘛;

4>不要給高重複值的列建索引,索引本身就是為了提高查詢速度,然而資料值高度重複,資料區別性不高,索引起不了效果)(比如說:性別);

5>不要給img,tex。bit資料型別使用索引,因為這種欄位一般使用很少,資料量太大;

(2)什麼場景用索引

1>經常要用於查詢的列 where id=?;

2>經常要用於排序(order by),分組(group by)的列,因為索引已經排好序了;

3>有值唯一性限制的列,比如說主鍵、使用者名稱;

6、索引在Mysql的使用方式

(1)在Mysql中索引是基於B+樹(請看推薦資料)的資料結構實現的;

(2)MyISAM資料引擎,表索引檔案和資料檔案是分離開的,主索引和輔助索引一樣,只是有主鍵的區別,主索引的鍵不能重複;InnoDB中表索引本身就是表資料檔案,索引節點中存的是表的資料而不是資料引用地址,輔索引完全依賴於主索引,輔索引的每次查詢都是找到對應主索引的節點再找到資料;

(3)InnoDB中必須要有一個聚集索引,而聚集索引在基於主鍵建立的,所以InnoDB的表必須要有主鍵,如果沒有顯示指定主鍵,Mysql會自動建立一個隱式主鍵;

(4)InnoDB除了主索引(聚集索引)之外的索引都是以輔助索引的形式存在,輔助索引每次檢索的時候是透過找到主索引再找到資料;

7、

推薦資料

磁碟和主存資料讀取原理:

http://

blog。csdn。net/abcd1101/

article/details/55281514

平衡二叉樹、B樹、B+樹:

https://

zhuanlan。zhihu。com/p/27

700617

MySQL索引背後的資料結構及演算法原理:

http://

blog。codinglabs。org/art

icles/theory-of-mysql-index。html

標簽: 索引  主鍵  資料  聚集  建立