有一个表A 哟字段c1,c2,c3,c4,c5、、、、、、c14,c15、、、、、,总数据量在1000W左右。MySQL版本是5.5.8,存储引擎是Innodb。经常作为查询条件的有c1,c2,c5,c14,c15,有可能是其中的3个字段作为查询条件,也有可能是4个字段作为查询条件,也有可能是5个字段作为查询条件。问下,这样的业务场景,如何建立索引? 我初步的想法是 
1,第一个索引:按照c1,c2,c5,c14,c15的顺序建立索引,在写sql的时候,后面的where条件是 where c1=pv and c2=pv  and c5=pv  and c14=pv  anc c15=pv ,pv为条件值。2,第二个索引:按照c2,c5,c15的顺序建立索引,在写sql的时候,后面的where条件是:where c2=pv  and c5=pv and c15=pv ,pv为条件值。3,第三个索引:按照c1,c5,c14,c15的顺序建立索引,在写sql的时候,后面的where条件是 where c1=pv and c5=pv  and c14=pv  anc c15=pv ,pv为条件值。不知道我的实现方案是不是比较恰当,大家给点建议,谢谢!

解决方案 »

  1.   

    MYSQL索引创建的规则
    1:数据分布情况。
    SELECT COUNT(DISTINCT(COL1))/COUNT(*) AS COL1,COUNT(DISTINCT(COL2))/COUNT(*) AS COL2
    FROM TBNAME;看看每个字段在表里的唯一性怎么样?对唯一性比较高的建索引,很差的就不用。2:查询分布
    统计一下WHERE后的条件分布情况,80%是WHERE COL1=100 AND COL3=300,那么就建INDEX(COL1,COL3)3:字符串索引的长度
    对已经确定需要创建索引的字段,确定索引长度
    SELECT COUNT(distinction(LEFT(COLNAME,1)))/COUNT(*) AS 1,COUNT(DISTINCT(LEFT(COLNAME,2)))/COUNT(*) AS 2 FROM TBNAME这样可以确定索引长度。在比率增加不明显的长度就是最佳索引长度。
      

  2.   

    SELECT COUNT(distinction(LEFT(COLNAME,1)))/COUNT(*) AS 1,COUNT(DISTINCT(LEFT(COLNAME,2)))/COUNT(*) AS 2 FROM TBNAME这个是拿啥规则来统计的,不是很明白。
      

  3.   

    最左边第1位的唯一个数占比   1%
    最左边第2位的唯一个数占比   5%
    最左边第3位的唯一个数占比   10%
    最左边第4位的唯一个数占比   40%
    最左边第5位的唯一个数占比   41%
    最左边第6位的唯一个数占比   41%举个这样的例子,那么INDEX的长度就该为4.
      

  4.   

    建索引的目的是尽可能减少where出来的结果集