blog:http://blog.csdn.net/zhaohuabing 轉載請註明出處
在學習和使用各種資料庫的過程中,我們常常會遇到聚族索引、非聚族索引、複合式索引的概念,這些索引對我們使用資料庫,特別是查詢的速度的影響是很大的,前幾天公司裡來了一個sybase的工程師,通過他的講解,我終於弄清楚了這幾個概念的真正含義,覺得雖然問題很小,但收穫滿大,在這裡和大家一起分享一下。
一、什麼是索引
索引可以理解為我們小時候使用的漢語字典的索引,如果想在字典中尋找一個字,一頁一頁地翻字典尋找是非常慢的,但如果使用字典的索引進行查詢,很快就可以查到了。資料庫的索引也是類似的。
資料庫中的索引一般是按照B樹來組織的,葉結點指向真正的資料,B樹的定義我這裡就不介紹了,有興趣的話可以去翻翻資料結構的書。
二、聚族索引
在這裡還是用字典來進行類比,一般來說漢語字典中有幾種索引,如拼音、偏旁、筆畫等。字典本身的組織也是排序的,我記得一般是按照拼音排序的。這裡的拼音就是聚族索引。也就是說聚族索引的組織順序和資料本身的組織順序是一致的,這也解釋了資料庫中只能定義一個聚族索引的原因,因為資料本身只能按一種方式進行排序。
那聚族索引有什麼特別的好處呢,這個好處就是在資料庫中執行尋找一批資料的語句會比較快,因為資料已經按照聚族索引排好序了,很少的io操作就可以將資料從庫中取出。好比你在字典中尋找發音從從a到c的漢字,只需要查到a的開始頁和c的結束頁,中間的所有頁都符合查詢要求,不用再一頁一頁地尋找。
圖1 聚族索引
三、非聚族索引
非聚族索引就好比字典裡的偏旁、筆畫索引,其索引組織順序和資料群組織順序不一致,因此非聚族索引可以建立多個。當尋找一條資料時,非聚族索引和聚族索引的效率相差不大,但尋找一批資料(n)時,非聚族索引需要的io可能是聚族索引的n倍,因為非聚族索引需要一條一條地進行尋找。
圖2 非聚族索引
四、複合式索引
複合式索引在索引的key中儲存了所有組成該複合式索引的欄位,但只按第一個欄位進行排序。因為索引key中儲存的內容增多,因此複合式索引需要的空間一般來說比單欄位索引大。複合式索引的好處是假如你的查詢需要返回的資料欄位都在複合式索引的索引欄位中,資料庫將不會訪問資料頁,而直接返回索引中的欄位值,可以加快查詢速度。假如你的查詢不滿足這個條件,複合式索引就是沒有意義的,反而浪費了儲存空間。
圖3 複合式索引
最後出一道小題目,考考大家看懂沒有:
假設表中一共有100條資料,索引的B樹為三層,查詢結果返回50條按照聚族索引排序的資料,不建索引查詢、按照聚族索引查詢、按照非聚族索引查詢所需的io次數各是多少?