亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

為什么離散程度高的放前面呢?

這個聯合索引,放前面放后面代表什么?為什么離散程度高的放前面呢?知其然而不知其所以然,不太好

正在回答

3 回答

簡單解釋,組合索引index(a,b) 會創建基于a,ab創建兩個索引。你想一下創建索引的原則是什么?如果某列的離散度很低,一個表有100w行數據,該列只有兩種不同的值,你會在該列上創建索引嗎? 所以就明白了,如果a的離散度很低,在a上創建索引和前面分析的原則是不是矛盾了??偨Y,就是要降低掃描索引的消耗,為什么離散度高了可以降低,這是btree的結構問題

2 回復 有任何疑惑可以回復我~
#1

greenhandc 提問者

非常感謝!
2017-07-06 回復 有任何疑惑可以回復我~

應該按老師說的好一點,自己試一下查詢的耗時就知道。

0 回復 有任何疑惑可以回復我~

知乎上有個答案跟老師說的完全相反,不知道到底該怎么理解。http://www.zhihu.com/question/31109426


作者:Lawrence.li
鏈接:http://www.zhihu.com/question/31109426/answer/66326216
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。

這里涉及兩個知識點:最左前綴left-prefix,列基數cardinality

最左前綴,可以理解為在復合索引中,越是左邊越好

因為分別對A,B,C三個列建聯合索引index,實際上是建立3個索引,每個索引都包含A
A,B,C
A,B
A

列基數,是指它所容納的所有非重復值的個數,可以理解為 ?distinct(某列)后的結果

比如某個列包含值1,3,7,4,7,3,那么它的基數就是4了

列基數越大,重復值越少,需要建索引,因為如果某列的值都是重復的就沒必要建索引了

是(`DistriType`,`DistriButTime`) 這樣建?還是這樣建 (`DistriButTime`,`DistriType`) ?

count一下就知道了

count(distinct DistriType) ?與 count(distinct DistriButTime)比較

猜測肯定是前者<后者,所以聯合索引把DistriTyp放左邊更優

再舉一個例子,一本字典,記錄了所有的姓名

分別用兩個字段,第一列:姓 ? ?第二列:名

很明顯 count(distinct 姓) 要比 count(distinct 名) 要少

因為百家姓,姓氏只有一百個,而名字可以自由組合很多個

劉 ? ?燁
劉 ? ?德華
劉 ? ?爾達

張 ? ?震
張 ? ?學友

所以如果要建立聯合索引,肯定是 ? key index ( 姓,名),先排姓氏,再排名字


0 回復 有任何疑惑可以回復我~
#1

likeflower950

我認為不盡然!你應該想說明是最后一條吧,就是按照字典的那個例子!字典這樣創建時因為姓和名字是一個整體,復合人們的讀習慣,但是計算機并不需要這樣的習慣,你完全可以先按照名字索引,再按照姓索引,index(名字,姓),因為名字重復的少,那么你想找劉德華的話,你第一步確定了5個叫德華的,然后再從這5個中找一個姓劉的就確定了記錄,但是如果按照你發的那個,那你第一步可能確定出來1000個姓劉的,第二步需要從這1000個劉姓中尋找叫德華的人。這樣的順序明顯沒有第一個好!
2017-06-28 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

為什么離散程度高的放前面呢?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號