为什么离散程度高的放前面呢?

来源:3-1 如何选择合适的列建立索引

greenhandc

2016-07-31 10:28

这个联合索引,放前面放后面代表什么?为什么离散程度高的放前面呢?知其然而不知其所以然,不太好

写回答 关注

3回答

  • Kollen
    2017-02-15 13:26:28
    已采纳

    简单解释,组合索引index(a,b) 会创建基于a,ab创建两个索引。你想一下创建索引的原则是什么?如果某列的离散度很低,一个表有100w行数据,该列只有两种不同的值,你会在该列上创建索引吗? 所以就明白了,如果a的离散度很低,在a上创建索引和前面分析的原则是不是矛盾了。总结,就是要降低扫描索引的消耗,为什么离散度高了可以降低,这是btree的结构问题

    greenh...

    非常感谢!

    2017-07-06 08:38:54

    共 1 条回复 >

  • 慕粉1470819953
    2017-01-12 14:20:02

    应该按老师说的好一点,自己试一下查询的耗时就知道。

  • greenhandc
    2016-07-31 11:47:06

    知乎上有个答案跟老师说的完全相反,不知道到底该怎么理解。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 ( 姓,名),先排姓氏,再排名字


    likefl...

    我认为不尽然!你应该想说明是最后一条吧,就是按照字典的那个例子!字典这样创建时因为姓和名字是一个整体,复合人们的读习惯,但是计算机并不需要这样的习惯,你完全可以先按照名字索引,再按照姓索引,index(名字,姓),因为名字重复的少,那么你想找刘德华的话,你第一步确定了5个叫德华的,然后再从这5个中找一个姓刘的就确定了记录,但是如果按照你发的那个,那你第一步可能确定出来1000个姓刘的,第二步需要从这1000个刘姓中寻找叫德华的人。这样的顺序明显没有第一个好!

    2017-06-28 23:39:30

    共 1 条回复 >

性能优化之MySQL优化

了解MySQL数据库优化的方法和技巧,在课程中共同探讨一起学习吧

101701 学习 · 221 问题

查看课程

相似问题