mysql复合索引 基数 范围搜索中索引顺序的问题?

作者:知乎用户
链接: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 名) 要少

因为百家姓,姓氏只有一百个,而名字可以*组合很多个

刘 烨
刘 德华
刘 尔达

张 震
张 学友

所以如果要建立联合索引,肯定是 key index ( 姓,名),先排姓氏,再排名字    
上一篇:mysql学习笔记,用distinct去除重复数据


下一篇:C#黔驴技巧之去重(Distinct)