這是數據庫索引相關內容的第三篇
複製代碼
目錄:數據庫
1. 什麼是索引api
索引對於數據庫,至關於目錄對應於圖書,咱們能經過索引快速的對數據庫的內容進行定位。post
當沒有索引,或者沒有一個合適的索引,在大量的表數據中查詢,將是一場災難;
優化
2. 索引的存儲spa
索引實際使用時其仍是佔用存儲空間的;設計
就像目錄也是佔用了圖書的幾頁紙同樣。指針
那麼索引,是如何存儲的呢?code
其實,索引的存儲就是用我在B樹是個什麼玩意中介紹的B樹方式或者其衍生(B+ B-)方式存儲。cdn
B樹索引能高效的提升磁盤IO,特別是對與數據庫這種數據量比較多的狀況,確定是但願比較少的磁盤讀取及每次讀取獲得比較多的數據;B樹就很好的知足了這種特性。blog
3.聚簇索引和非聚簇索引
聚簇索引是比較容易混淆的概念,在不一樣的數據庫中,其表明的意義是不同的。
通常咱們認爲聚簇索引有以下特性:
1> 聚簇索引肯定表中數據的物理順序
2> 每張表只能建一個聚簇索引
3> 當聚簇索引缺失時,默認主鍵爲聚簇索引
4> 非聚簇索引葉子節點指向聚簇索引
由此看來,聚簇索引是很是珍貴的,當查詢的條件正好是聚簇索引能覆蓋的範圍時,是很是快速的;由於經過索引就能找到數據,不用再到磁盤上進行屢次查找。
4.索引片
查詢時,理想的狀況是,查詢條件已經覆蓋在索引中了,查詢是基於索引的查詢,那此時查詢速度會比較快;可是實際狀況卻很複雜,這就須要咱們知道優化器是如何根據查詢條件及索引來進行查詢的。流程以下:
從頭至尾依次檢查索引列
1.在where子句中,該列是否至少擁有一個足夠簡單的查詢與之對應?
若是有,那麼這個列就是匹配列;
若是沒有,那麼這個列及其後面的索引列都是非匹配列
2.若是該索引對應的查詢條件是範圍,那麼剩餘的索引都是非匹配列
3.對於最後一個匹配列以後的索引列,若是擁有一個足夠簡單的查詢條件與其對應,那麼該列就是過濾列
複製代碼
好比索引(A,B,C,D),對應查詢條件where A = 1 and B < 3 and C = 2
按照流程圖,首先看A,A的查詢語句是A = 1,足夠簡單,且不是範圍條件,因此A是匹配索引
再看B,B是條件查詢,B<3,因此B是匹配索引,可是B後面的索引都是非匹配索引;
再看查詢條件,還有C=2,由於C雖然是索引,可是由於B是範圍查詢,因此其後的全部索引都是非匹配索引,因此C是非匹配索引,可是由於C也有簡單的查詢條件,因此C是過濾列
綜上所述,對於索引(A,B,C,D),其在查詢條件where A = 1 and B < 3 and C = 2中,索引片是(A,B)過濾列是C
那這個結果意味着什麼?
好比索引有100w條,那麼根據上述流程圖,A,B是索引片
那麼基於這100W條,經過A,B組合查找出假設10w條,再經過C,在這10W條中進行過濾,最後剩餘1w條
索引片越窄,即參與過濾的索引越多,那麼效率就會越高,由於索引片自己的查找是基於索引的,即B樹查找;
那是否是索引片窄了就好了呢?
其實索引涉及的內容還有不少,好比若是涉及到排序、聯合查詢、索引數目太多,什麼纔是好的索引等等
在此建議你們看《數據庫索引設計與優化》(Tapio Lahdenmaki/Michael Leach)
通俗易懂的解釋了索引的工做原理,以及如何設計索引
其餘相關章節
複製代碼
數據庫索引相關文章之一:《B樹,一點都不神祕》
數據庫索引相關文章之二:《B樹很簡單,插入so easy》
數據庫索引相關文章之三:《索引》
數據庫索引相關文章之四:《什麼索引算是好的索引》
數據庫索引相關文章之五:《如何發現及替換不合適的索引》
數據庫索引相關文章之六:《索引總結》