作者:知乎用户
链接:https://www.zhihu.com/question/31109426/answer/66326216
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://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 名) 要少
因为百家姓,姓氏只有一百个,而名字可以自由组合很多个
刘 烨
刘 德华
刘 尔达
张 震
张 学友