zoukankan      html  css  js  c++  java
  • 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 ( 姓,名),先排姓氏,再排名字
     
     
  • 相关阅读:
    request常用的方法
    JS通过正则限制 input 输入框只能输入整数、小数(金额或者现金)
    基于云原生的秒杀系统设计思路
    html<input>输入框中各种正则表达式设置
    cursor:hand与cursor:pointer的区别介绍
    读入/输出优化
    手动扩栈,防止溢出
    快速乘(O(1))
    二分图若干性质
    康拓展开
  • 原文地址:https://www.cnblogs.com/xiami2046/p/12825444.html
Copyright © 2011-2022 走看看