联合索引
索引不含查询列可以考虑联合索引
如果我们想读取索引列和非索引列的值,但是不想发生索引回表读,怎么办
如我们想查询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) 收藏 举报
浙公网安备 33010602011771号