為什么建立索引
如有SQL語句:
SELECT * FROM STUDENT WHERE C1 = 2013222;
如果需要查詢對應的記錄:
無索引:數據庫按照一定的順序(物理順序、插入順序)查找比較表中所有記錄,直到找到所有記錄為止;
有索引:如果在C1列有對應的索引,則在查找的過程中數據庫不需要遍歷所有記錄,就可以找出所有符合條件的記錄;
所以,建立索引主要的作用是優化查詢的速度;
索引的一般實現方式
前面說到索引可及減少比較的次數,之所以能這樣是索引保存了對應列的有序關系以及對應的物理地址:
簡單的比如: 在一個有序的數組中要查找一個數必定要比在一個無序的數組中查找要簡單很多;
索引實現的一般算法:
B-Tree和B+Tree(算法略)
目前大部分數據庫系統及文件系統都采用B-Tree或其變種B+Tree作為索引結構。具體采用何種算法,需要考慮算法的時間復雜度和數據物理存儲方式(略);
由於B-Tree的特性,在B-Tree中按key檢索數據的算法非常直觀:首先從根節點進行二分查找,如果找到則返回對應節點的data,否則對相應區間的指針指向的節點遞歸進行查找,直到找到節點或找到null指針,前者查找成功,后者查找失敗。:
通過上圖,我們可以發現,在有索引的數據表中,可以通過一定的數據結構快速查找定位,再通過所保存的物理地址信息獲取到對應的記錄數據;
聚集索引:保證物理順序和邏輯順序(索引順序)一致;
該不該建索引
索引並不是越多越好,索引本身需要存儲空間,同時索引的維護也需要一定的開銷
確定是否有必要建立索引大致需要考慮以下幾個問題:
1.建立索引的列的數據類型應該為基本的數據類型
對於BLOB,TEXT等數據量較大或二進制的字段,數據量大,不建議創建索引;
2.建立索引的列是否為經常作為查詢條件的列
如果某一列經常作為WHERE語句中的查詢條件,則可以考略在對應列上建立索引;
3.建立索引的列的值是否分布均勻(重復字段少)
比如表示性別字段,只會出現男和女兩個值,且重復的情況較多,也不建議創建索引;
4.建立索引的列是否為經常變化的字段
對於一些經常變化的字段或者臨時表,不建議創建索引,因為值的改變和記錄的增刪都需要動態維護索引,會增加數據庫的開銷,減小了數據更新的效率;
總之,是否有必要建立索引需要綜合考慮查詢效率和數據修改的效率;
參考:
關於數據庫索引設計的幾個常用算法
MySQL索引背后的數據結構及算法原理
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。