## **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](https://link.zhihu.com/?target=http%3A//blog.csdn.net/abcd1101/article/details/55281514)
平衡二叉樹、B樹、B+樹:[https://zhuanlan.zhihu.com/p/27700617](https://zhuanlan.zhihu.com/p/27700617)
[MySQL索引背后的數據結構及算法原理](http://blog.codinglabs.org/articles/theory-of-mysql-index.html)