建索引的目的是为了更好的查询,但是不要盲目建索引,有时候适得其反。
遵循这样的原则:
1.搜索的索引列,不一定是索要选择的列
  例如:select col_a from tbl1 left join tbl2 on   tbl1.col_b=tbl2.col_c
  where col_d=expr
在这查询重视合作索引列的是tbl1.col_b and tbl2.col_c and col_d
2.使用唯一索引:对于唯一值的列,索引的效果最好,而具有多个重复值的列
  其索引效果最差。
3.使用短索引:应该指定一个前缀的长度,只要有可能就应该这样做
  例如:varchar(100)列,对前10个或者20个字符内,多数值是唯一的那就不要对整个列索引。
4.利用最左索引:在创建n列的索引时,实际是创建了mysql可利用的n个索引,多列索引可以起几个索引的作用,因为可以利用索引中最左边的列集来匹配。
 ps: mysql不能使用不涉及左前缀的搜索。
5.不要过渡索引:
  每个额外的索引都是要占额外的磁盘空间,并降低写操作的性能。
6.考虑在列上进行比较的类型:
  索引可用于"<"、"<="、"="、">="、">"和 between 运算。本人卓见,仅供参考!

解决方案 »

  1.   

    先感谢楼上的建议。
    那么我提的这个问题该如何做呢?如果有两个SQL语句,分别如下:
    select * from TA where A=... and B=... and C=... order by D
    select * from TA where A=... and D=... order by C desc,B
    那么又改如何安排索引才能使查询效率最高呢?其中A,B,C,D都被用到了,假设B,C,D都是int型的,是有重复项的,那么它们是各自单独建索引还是合在一起建一个索引好呢?
    我觉得如果把他们三个按照B,C,D的顺序合在一起的话,对第二个查询语句好像不是太合适。还有一种情况就是,假设在上例中B是integer,C和D都是varchar(100),那么在下面这个SQL查询中,
    select * from TA where A=... and B=... and C='...' and D='...' order by B
    如果按照B,C,D的顺序建一个索引应该是比较合适的。
    但如果同时有另一个查询
    select * from TA where D=... order by D
    那么上面的那个查询好像就不是很合适了(因为D在最后面,查询效率低)。
    在这种情况下,如果单独为D建一个索引,则上面的那个复合索引就有了冗余项,是否应该把上面那个索引里面的D去掉呢?(但那样,上面那个查询使用的索引就不是最优化的了)以上是我的一些疑问,请大家指点。谢谢!
      

  2.   

    请bombshell(水中鱼)再帮忙回答一下,谢谢!