为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

正在回答

3 回答

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

2 回复 有任何疑惑可以回复我~
#1

greenhandc 提问者

非常感谢!
2017-07-06 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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


0 回复 有任何疑惑可以回复我~
#1

likeflower950

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

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信