數據庫索引之離散度


    創建索引的目的是快速從整體集合中選擇性地讀取滿足條件的一部分集合。在查詢條件中既有對縮減查詢范圍起主要作用的驅動查詢條件,也有單純起檢驗作用的過濾查詢條件,數據庫將全部滿足這兩種查詢條件的最終結果輸出給我們。由此可見,雖然獲得的最終結果相同,但是隨着查詢條件所起作用的不同,內部所處理的數據量具有很大的差異。

    因此,最理想的方法就是把擁有最小查詢范圍的條件作為驅動查詢條件來使用。這里的最小查詢范圍也就意味着滿足條件的數據在整體中所占的比重較小。所以,基於什么樣的條件來創建索引將對縮減處理范圍有着較大的影響。對於特定的讀取類型,最有效的索引就是基於常量比較的列來創建的組合索引。

    離散度在不超過全表的10%-15%的前提下索引才可以顯示其所具有的價值。當離散度超過該值的情況下全表掃描可能反倒比索引掃描更有效。我們所追求的目標就是創建全表掃描所無法比擬的有效索引。

    假設某個索引的離散度<1%,很明顯小於損益分界點,但是在海量表中也不是個小數目,仍然會對在線處理構成極大的負擔。如果基於一個列所創建的索引 無法實現預期目標,那么在不得已的情況下也只能基於多個列來創建組合索引。在各個列的離散度不太好的情況下,可以將這些列進行有效的組合,通過合力的有效 使用可以取得意想不到的效果。

    為了實現以最少的索引滿足對某個表的多樣化的數據讀取要求,應當為每個索引分配合理的任務。

    1)在允許的情況下,對具有較好離散度的列單獨創建索引,這樣可以提高該索引的使用彈性;

    2)對於離散度較差的列,通過對多列進行合理的組合來創建組合索引,雖然這樣做在很大程度上降低了各個列的使用彈性,但是卻可以發揮多個列的綜合效應。

    有時候基於離散度較好的列所創建的索引會與其識別能力比較相似的其他索引進行競爭。

     如果很容易就能夠分辨出查詢條件的優劣,則只需要從中選擇最好的一個作為驅動查詢條件就可以了;但是如果很難分辨,則需要考慮讓多個列相互組合來共同負責數據的讀取任務,這就是所謂的索引合並(Index Merge)。

    只有當合並的索引具有相似的離散度時索引合並才比較有效,當索引的離散度相差較大時使用索引合並的方法反倒容易影響執行效率。在兩個索引行數懸殊的情況下,通常只使用其中最好的一個索引來負責讀取數據,而另外的索引只負責檢驗即可。

    在實際工作中,經常會遇到即使列的離散度不好也必須要創建索引的情況,為了解決此類問題而需要創建組合索引(Concatenated Index)。所謂的組合索引是指基於多列所創建的索引。在組合索引中執行索引合並時,由於提前將滿足條件的行集集中到了一起,所以可以在很大程度上提高 讀取數據的速度。

    但是組合索引並非總能提高讀取速度。只有在查詢條件中對索引列使用了等值比較時組合索引才能夠有突出的表現。當沒有為組合索引中的第一個索引列賦予查詢條件時,使用組合索引的效果會驟減,所以它的使用彈性和靈活性在很多條件下都受到限制。
 
   注:離散度可以用 最大行數 - 最小行數 / 總行數 來衡量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM