全表扫描:读取表中所有的行
索引扫描:类似全表扫描
索引查找:定位到索引指向的局部位置
产生索引扫描的原因:
1.隐式转换容易从索引查找变成索引扫描
2.统计信息缺失或者不正确容易导致索引扫描
3.where子句中的谓词不是联合索引的第一列
对于联合索引最左边一列存有统计信息,其他列sqlserver不存统计信息
4.where 子句里串联会导致索引失效
where A+B = ... (索引为A,B联合索引)
解决方法:
1).A+B生成一个计算列
2).where A = ...and where b=...
5.=,>,<,>=,<=,between,已经部分like(like'%XXX') 可以使用索引查找
优化like查找:
1)在oracle中可以使用instr
select count(*) from table t where instr(t.code,'Cod2%') > 0
2)在mysql中可以用locate和position函数,
如field like '%AAA%'可以改为locate('AAA',field) > 0
或POSITION('AAA' IN field)>0。
3)在sql server中,可以给字段建立全文索引,用contains来检索数据
6.where条件中使用标量函数回事索引查找转为索引扫描
7.隐式转换:表中的数据与where条件或者on条件的变量格式不一致,或者两个相关联的表的格式不一致