到底對“索引”怎麼樣理解

轉自http://www.iteye.com/topic/1038366

 

今天,我在一個java羣和別人討論對索引的理解問題。
大家說了半天我都無法理解他們在說什麼。
我還在網上查看了很多關於索引的定義,
但都是太籠統沒有比喻也沒有具體的例子。

最後我只能說出我對索引的理解。

我個人定義索引是:一個已經按照一定規則排序好的數據結構或數據集。

下面舉例

例子1:

現在有一張表,裏面有10W行數據,其中有一個列,列的名字叫name,數據類型爲字符串
現在要查詢一個name爲tom的,好,現在在name上建立一個數據庫默認的索引。
我相信,大多數數據庫對字符串類型的列,默認都是按字母升序排列的。
首先查看了一下第一個有tom的這行數據出現在表的第38511行
建立索引後按照我原先的簡單按字母升序排序,第一個出現有tom的這行數據排列到了85536行
如果按照這個索引結構來查詢第一個出現tom的話還比沒有建立這個索引時要慢,原因很簡單。
查詢時的數據集發生了改變,原來一行行找下來要找38511次,現在按照這個索引結構找下來要85536次

但默認的索引結構也許不是這樣的。也許它套用了一個樹結構,這個樹也許就2層
第一層是按字符串首字母升序排序好的單個字母a,b,c,d,e,f,g,h....,(其中也許字母x沒有,這也是有可能的)
第二層是按字符串首字母歸類好的數據集合,並且每個集合按字母升序也是排序好的。

那麼查詢tom的時候,檢查到tom是在第一層樹的第20字母上,也就是t,查詢這一層只花了20次比較
然後在第二層的以T字母開頭排序好的數據集中發現tom在這個數據集的第16行。

那麼按照這個索引結構查詢name爲tom的數據行最快的只要比較20+16次就可以找到第一個符合的數據

但如果tom這行數據在表裏就排在第10行,那麼按照上面的索引結構搜索找到所花的時間還要長。

例子2:

現在有一張表,裏面有10W行數據,其中有一個列,列的名字叫id,類型整數,
現在要查詢一個id爲83111的。現在在id上建立一個數據庫默認的索引
我相信,大多數數據庫對默認的整數類型的列,都是按數字升序排列的。
首先查看了一下第一個有83111的這行數據排列在83111行
建立索引後按照原先的簡單按數字升序排序,第一個出現有83111的這行數據還是出現在表的第83111行
如果按照這個索引結構來查詢第一個出現id爲83111的話和沒有建立這個索引時一樣的速度。原因還是很簡單。
查詢時的數據集和表集是一樣的。

但默認的索引結構也許不是這樣的,也許它套用了一個樹結構,這個樹也許就2層
第一層每個支點爲,>=0 & <= 9999, >=10000 & <= 19999, 這樣一直下去,
節點的最大一個範圍取決於id最大的一個數它所在的那個範圍。
第二層是在某一個範圍內已經按數字升序排列好的數據集。
那麼查找83111這個id,先比較第一層的範圍,發現83111在,>=80000 & <=89999 中,第一層比較了9次,
然後在這個範圍內在查找83111,發現在3112行,也就是比較了3112次
最後找到這個數總共才花了3112+9次的比較。


通過舉例終於可以理解爲什麼要建立索引,和建立索引的優點和缺點。
看來建立索引要有很強的排序算法支持。

不知道大家看懂了嗎,同意我個人對索引的定義嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章