联合索引

索引不含查询列可以考虑联合索引

如果我们想读取索引列和非索引列的值,但是不想发生索引回表读,怎么办

如我们想查询id列和name列的值

create index aa on t(id,name)

性能比回表高效

但是联合索引的索引列最多不能超过3列,如果索引列太多,那么索引块势必会多,就会遍历更多的所以块

建立联合索引能够避免回表读 在执行计划中回表的动作时 access table by index rowid

 

联合索引适用的第二个场合

就是组合列返回越少越高效

select count(*) from a where id =1; 返回记录很多

select count(*) from a where name='aa'; 返回记录很多

select count(*) from a where id=1 and name='aa' 返回记录很少

 

这样的场景适合用联合索引

 

如果建一个联合索引,那么哪个索引列放在前面会更高效呢

如create index aa on t(id,name);

ctreate index bb on t(name,id);

对于这个语句 select * from t where id=ss and name=bb

试验证明哪个索引列放在前面效率都是一样的。

但是对于id查的是范围值 如id>20and id<2000 name=bb

那么等值的放在前面更高效

重要结论:组合索引的两列,当一列是范围查询,一列是等值查询,那么等值查询放在前面这样的索引才最高效

 

原理探讨

为什么两列都是等值查询时,索引列排放顺序为所谓。效率一样

为什么有范围查询时,那么等值查询放在前面更高效

 

posted on 2014-05-30 10:31  todayiwillgo  阅读(855)  评论(0)    收藏  举报

导航