为什么离散程度高的放前面呢?
这个联合索引,放前面放后面代表什么?为什么离散程度高的放前面呢?知其然而不知其所以然,不太好
这个联合索引,放前面放后面代表什么?为什么离散程度高的放前面呢?知其然而不知其所以然,不太好
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 ( 姓,名),先排姓氏,再排名字
举报