假定现有一张表
包括c1,c2,c3,c4,c5这5列(或者更多),
列类型是int或char中的一种,就是说列类型只包含这两种,不涉及2进制等其他列类型,
已知对该表的查询需求是这5列都有可能涉及到,
即where条件是这5列的排列组合,且为and关联,
但是可以确定这5列在where中的顺序为c1,c2,c3,c4,c5
即如果c1列作为查询条件使用的话,必定排在c2,c3,c4,c5之前
如果c2列作为查询条件使用的话,必定排在c3,c4,c5之前
例如,where条件可能为:
where c1 = ? and c2 = ? and c4 = ? and c5 = ?;
或where c3 = ? and c4 = ? and c5 = ?;
或where c1 = ? and c4 = ?;
或where c2 = ? and c3 = ? and c5 = ?;
等等我想问的是
对于这样的查询需求
建立索引的话,应该是单独对每列建立单列索引,总共建立5个单列索引,对程序整体的效率提高较大,
还是按照一定的规则建立若干个多列索引,对程序整体的效率提高较大(如果是这样,该怎么建)?

解决方案 »

  1.   

    where c1 = ? and c2 = ? and            c4 = ? and c5 = ?;
    where                       c3 = ? and c4 = ? and c5 = ?;
    where c1 = ? and                       c4 = ?;
    where            c2 = ? and c3 = ? and            c5 = ?;并无特殊的排列,只能根据需要创建多个索引,另外还要分析你的各个字段中值的分布。 请描述一下你各字段中值的分布情况。
      

  2.   


    哦 c1 是 取值1-255均匀分布
    c2 取值0-9均匀分布
    c3 散列-1,0,3,7,58,99 
    c4,c5为 字符串只是我感觉 哪个是c1哪个是c2这个无所谓啊 我也只是举个例子
    而且这个顺序是可以按照自己需要,怎么方便怎么安排啊
    因为我觉得这个顺序只涉及到使用索引时是否可以用最左子集
    所以当然是怎么方便怎么安排啊
      

  3.   

    既然无所谓,那就泛泛而答吧。
    where c1 = ? and c2 = ? and            c4 = ? and c5 = ?;
    where                       c3 = ? and c4 = ? and c5 = ?;
    where c1 = ? and                       c4 = ?;
    where            c2 = ? and c3 = ? and            c5 = ?;
    创建如下索引(c1,c2,,c4,c5)
    (c4,c5)
    (c2)
    数据库优化需要大量的分析,没有分析统计的基础上谈不上什么优化。  不麻烦楼主了。
      

  4.   

    做5个单列索引吧。在查询的时候,如果可能用到多个多列索引的时候,MYSQL会自动进行索引合并,效率很好。