課程
/數據庫
/MySQL
/性能優化之MySQL優化
這個聯合索引,放前面放后面代表什么?為什么離散程度高的放前面呢?知其然而不知其所以然,不太好
2016-07-31
源自:性能優化之MySQL優化 3-1
正在回答
簡單解釋,組合索引index(a,b) 會創建基于a,ab創建兩個索引。你想一下創建索引的原則是什么?如果某列的離散度很低,一個表有100w行數據,該列只有兩種不同的值,你會在該列上創建索引嗎? 所以就明白了,如果a的離散度很低,在a上創建索引和前面分析的原則是不是矛盾了??偨Y,就是要降低掃描索引的消耗,為什么離散度高了可以降低,這是btree的結構問題
greenhandc 提問者
應該按老師說的好一點,自己試一下查詢的耗時就知道。
知乎上有個答案跟老師說的完全相反,不知道到底該怎么理解。http://www.zhihu.com/question/31109426
作者:Lawrence.li鏈接:http://www.zhihu.com/question/31109426/answer/66326216來源:知乎著作權歸作者所有,轉載請聯系作者獲得授權。
這里涉及兩個知識點:最左前綴left-prefix,列基數cardinality最左前綴,可以理解為在復合索引中,越是左邊越好因為分別對A,B,C三個列建聯合索引index,實際上是建立3個索引,每個索引都包含AA,B,CA,BA列基數,是指它所容納的所有非重復值的個數,可以理解為 ?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 ( 姓,名),先排姓氏,再排名字
likeflower950
舉報
了解MySQL數據庫優化的方法和技巧,在課程中共同探討一起學習吧
2 回答離散程度的大小的判定方法
3 回答按照課程例子 為什么使用子查詢返回的結果也是重復的呢
1 回答join查詢方式為什么比子查詢的方式速度更快?
1 回答order by title 此處title有索引,為什么還是filesort呢?
1 回答為啥子查詢的效率沒有鏈接查詢的效率高?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2017-02-15
簡單解釋,組合索引index(a,b) 會創建基于a,ab創建兩個索引。你想一下創建索引的原則是什么?如果某列的離散度很低,一個表有100w行數據,該列只有兩種不同的值,你會在該列上創建索引嗎? 所以就明白了,如果a的離散度很低,在a上創建索引和前面分析的原則是不是矛盾了??偨Y,就是要降低掃描索引的消耗,為什么離散度高了可以降低,這是btree的結構問題
2017-01-12
應該按老師說的好一點,自己試一下查詢的耗時就知道。
2016-07-31
知乎上有個答案跟老師說的完全相反,不知道到底該怎么理解。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 ( 姓,名),先排姓氏,再排名字