快速理解索引原理
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/27700617
MySQL索引背後的數據結構及演算法原理:http://blog.codinglabs.org/articles/theory-of-mysql-index.html
推薦閱讀:
※20180101「引得市」資料庫與「古文字缺字資料庫」更新及使用說明
※如何理解Mysql的索引及他們的原理?
※高性能mysql優化二之索引篇
※20171225《甲骨文字詁林補編》索引數位化完成
TAG:索引 |