数据库索引,复合索引

    在执行性能压测时,排查问题后发现根源是 数据库索引用的不对。实际创建了复合索引,但是select语句执行时,并没有走索引。故在此学习备注一下索引的使用,复合索引的注意点。
一、索引
        首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。
         那么在任何时候都应该加索引么?这里有几个反例:
1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。
2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。
3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。
 
二、复合索引
       根据你的where条件选择复合索引.如果查询是根据多个列,如where   Name= 'aa '   and   class= 'bb ',那么在Name和Class上建立符合索引会比较好.  但是复合索引的顺序一定要和查询的顺序相同才有效,如果顺序不同,那就没有效果了. 
         是否建立复合索引要根据查询的需要,如果很多查询都是where   Name= 'aa '   and   class= 'bb '这样的形式,那建立复合索引就非常好.如果有一部分查询是where   class= 'cc '   那么你就应该在class上边建立单索引.所以最重要的是根据查询的条件.
三、复合索引对排序的优化:
复合索引只对和索引中排序相同或相反的order by 语句优化。
查询优化器在在where查询中的作用:
如果一个多列索引存在于 列 Col1 和 Col2 上,则以下语句:
Select   * from table where   col1=val1 AND col2=val2
查询优化器会试图通过决定哪个索引将找到更少的行。之后用得到的索引去取值。
1. 如果存在一个复合索引,任何最左面的索引前缀能被优化器使用。所以复合索引的顺序不同,影响索引的选择, 尽量将值少的放在前面
如:一个复合索引为 (col1 ,col2, col3)
    那么在索引在列 (col1) 、(col1 col2) 、(col1 col2 col3) 的搜索会有作用。
2.  如果列不构成索引的最左面前缀,则建立的索引将不起作用
如:一个复合索引为 (col1 ,col2, col3),最左前缀是col1,则要使用这个索引,搜索条件where中必须包含col1=val1.
以下执行语句不会走索引:
SELECT * FROM  tb WHERE  col3 = val3  
SELECT * FROM  tb  WHERE  col2 = val2  
SELECT * FROM  tb  WHERE  col2 = val2  and  col3=val3  
3. 如果一个 Like 语句的查询条件不以通配符起始则使用索引。
如:%车 或 %车%   不使用索引。
    车%              使用索引。
 
四、索引的缺点:
1.       占用磁盘空间。
2.       增加了插入和删除的操作时间。一个表拥有的索引越多,插入和删除的速度越慢。如 要求快速录入的系统不宜建过多索引。
 
原文参考:

猜你喜欢

转载自zouyanfly.iteye.com/blog/1869484