在这里问两个关于复合索引的问题,麻烦各位大侠帮个忙,感激不尽!!!
(1)
假设table1表有1千万的数据,a列的取值范围[0,10],而b列的取值范围[0,1000]。
我建立复合索引是 a,b 还是 b,a
a和b的先后顺序有影响吗?(2)
如果我有一个table2,我经常要按照a,b,c,d,e的组合来查表。
而这些字段的取值都比较小,一般都是[0,5]左右,建立一个(a,b,c,d,e)这样的复合索引会不会对性能没有什么好的帮助呢?
如果我在table2表中新建一个字段id,然后update table2 set id = (((a*10 + b)*10 + c)*10 + d)*10 + e;
然后对id这列字段建立索引,这样是否会比较快呢?是否可行呢?

解决方案 »

  1.   

    (1):没有测试过,但感觉应该是一样的,索引实际上就是一个比较小的表,字段的先后顺序应该没有影响。但是否使用符合索引应当注意。
    (2):你执行这样的update以后肯定会快一些,就相当于创建了一个函数索引。
      

  2.   

    1、建立复合索引应该把经常用来查询的字段放在前面,比如经常用 where b=? 的方式来查询,那么b就应在前面,反之a就在前面。但是,如果总是a,b一起出现,那么没有多大差异,但还是建议把b放在前面,毕竟b的可选择性强一些2、直接建立函数索引
      

  3.   

    谢谢各位大侠,不过第一个问题,自已感觉,如果先找数据范围比较小的a,会不会一下缩短数据查找的范围呢?
    比如我要查找a=3 and b=567,而建立的索引如果是(a,b),那我先找a,会不会一下子把数据缩短了比较小的范围,这样比先查b应该会不一样吧。个人感觉是这样的,但是上网找了不少资料,就是没有讲这个方面的。
      

  4.   

    恰恰相反:
    1000w数据,假如分布均匀:
    a列的取值范围[0,10],也就是说每一个a值对应100w记录;
    b列的取值范围[0,1000],也就是说每一个b值对应1w记录显然,先按b查询可以更大程度缩小数据范围
      

  5.   

    假设a和b列上数据分布均匀,查询时条件中总是包含a和b。我觉得如果条件都是a=XXX和b=XXX,那么复合索引的次序选择b+a;如果条件是一个是等于某个值,另一个是范围查找(如大于,小于等),那么等于某个值的那列在复合索引中排在前面;如果条件中都是范围查找,那么我会选择b+a的次序建复合索引。
      

  6.   

    如果table2极少被更新,那么对这五个字段分别建bitmap索引。