索引 Index -- 快速查找数据
文章目錄
- 1. 為什么需要索引
- 2. 索引的需求定義
- 2.1 功能性需求
- 2.2 非功能性需求
- 3. 構建索引常用的數據結構
- 4. 總結
索引這種常用的技術解決思路,底層往往會依賴哪些數據結構?
1. 為什么需要索引
實際的軟件開發中,它們的本質都可以抽象為“對數據的存儲和計算”。
- 存儲,增刪改查。一旦存儲的數據很多,性能就成了關注的重點
- “如何節省存儲空間、提高數據增刪改查的效率”,是設計的重點。不夸張地說,索引設計得好壞,直接決定了這些系統是否優秀。
2. 索引的需求定義
2.1 功能性需求
-
數據是格式化數據還是非格式化數據?要構建索引的原始數據,類型有很多。分為兩類,一類是結構化數據,比如,MySQL數據;另一類是非結構化數據,比如網頁。對于非結構化數據,需要做預處理,提取出查詢關鍵詞,對關鍵詞構建索引。
-
數據是靜態還是動態?如果原始數據是靜態數據,不會有數據的增加、刪除、更新操作,所以,在構建索引的時候,只需要考慮查詢效率就可以了。大部分情況下,我們都是對動態數據構建索引,不僅要考慮到索引的查詢效率,還需要動態更新索引。
-
索引存儲在內存還是硬盤?存儲在內存,查詢速度比磁盤高。索引大的時候,內存有限,可能不得不將索引存在磁盤中。還可以一部分存在內存,一部分存在磁盤,兼顧內存消耗和查詢效率。
-
單值查找還是區間查找?
-
單關鍵詞查找還是多關鍵詞組合查找?比如,搜索引擎中構建的索引,既要支持一個關鍵詞的查找,比如“數據結構”,也要支持組合關鍵詞查找,比如“數據結構 & 算法”。對于多關鍵詞查詢來說,要分多種情況。像MySQL這種結構化數據的查詢需求,可以實現針對多個關鍵詞的組合,建立索引;對于像搜索引擎這樣的非結構數據的查詢需求,可以針對單個關鍵詞構建索引,然后通過集合操作,比如求并集、求交集等,計算出多個關鍵詞組合的查詢結果。
2.2 非功能性需求
-
不管是存在內存中還是磁盤中,索引對存儲空間的消耗不能過大。
-
考慮索引查詢效率的同時,還要考慮索引的維護成本。索引的目的是提高查詢效率,但是,基于動態數據集合構建的索引,還要考慮索引的維護成本。因為在原始數據動態增刪改的同時,也需要動態的更新索引。而索引的更新會影響到增刪改操作的性能。
3. 構建索引常用的數據結構
常用來構建索引的數據結構,就是講過的幾種支持動態數據集合的數據結構。比如,散列表、紅黑樹、跳表、B+樹。除此之外,位圖、布隆過濾器可以作為輔助索引,有序數組可以用來對靜態數據構建索引。
-
散列表增刪改查操作的性能非常好,時間復雜度是O(1)。一些鍵值數據庫,比如Redis、Memcache,就是使用散列表來構建索引的。這類索引,一般都構建在內存中。
-
紅黑樹作為一種常用的平衡二叉查找樹,數據插入、刪除、查找的時間復雜度是O(log n),也非常適合用來構建內存索引。Ext文件系統中,對磁盤塊的索引,用的就是紅黑樹。
-
B+樹比紅黑樹來說,更適合構建存儲在磁盤中的索引。B+樹是多叉樹,對相同個數的數據構建索引,B+樹的高度要低于紅黑樹。查詢時,讀取B+樹索引,需要的磁盤IO次數更少。所以,大部分關系型數據庫索引,比如MySQL、Oracle,都是用B+樹來實現的。
-
跳表也支持快速添加、刪除、查找數據。而且,通過靈活調整索引結點個數和數據個數之間的比例,可以很好地平衡索引對內存的消耗及其查詢效率。Redis中的有序集合,就是用跳表來構建的。
-
布隆過濾器有一定的判錯率。盡管對于判定存在的數據,有可能并不存在,但是對于判定不存在的數據,那肯定就不存在。更大的特點,就是內存占用非常少。針對數據,構建一個布隆過濾器,存儲在內存中。要查詢時,先通過布隆過濾器,判定是否存在。如果判定數據不存在,就沒必要讀取磁盤中的索引了。對于數據不存在的情況,數據查詢就更加快速了。
-
有序數組也可被作為索引。如果數據是靜態的,可以把數據的關鍵詞抽取出來,組織成有序數組,然后利用二分查找來快速查找數據。
4. 總結
架構設計離不開數據結構和算法。要想成長為一個優秀的業務架構師、基礎架構師,數據結構和算法的根基一定要打穩。那些看似很驚艷的架構設計思路,實際上,都是來自最常用的數據結構和算法。
總結
以上是生活随笔為你收集整理的索引 Index -- 快速查找数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 2453 贪心应用
- 下一篇: 上传图片自动加水印html,html5上