1.哪些操作会引起全表扫描——>引起全表扫描的SQL语句
对于全表的查询和操作
- 没有设置查询条件,即全表查询 select * from tablename ; select count(*) from table
- Update 语句改全字段
如果只更改1、2个字段,不要Update全部字段 - join连接表
索引失效,只能走全表扫描
-
模糊查询:
只有右模糊‘…%'可以成功利用索引;
左模糊‘%…'和全模糊‘%…%'都不能成功利用索引。 -
查询条件
3.1含有is/not null
索引失效
解决办法:索引列避免is null;使用组合索引3.2含有<>、!=
索引失效
解决方法:通过把不等于操作符改成or,可以使用索引
column<>’aaa’,改成 column<’aaa’ or column>’aaa’3.3 or语句中两个条件,一个有索引,一个没索引
where column1 < ‘1’ or column2 >‘3’ 只有column1和column2都使用了索引,索引才会有效,否则导致索引失效 -
组合索引使用不当
查询条件中没有前导列,导致索引不起作用;create index skip1 on emp5(job,empno); select count(*) from emp5 where empno=7900; //全表扫描 select /*+ index(emp5 skip1)*/ count(*) from emp5 where empno=7900; //使用(前导列)组合索引
查询条件中没有使用所有的列,导致索引不起作用;
create index skip1 on emp5(job,empno,date); select job,empno from emp5 where job=’manager’and empno=’10’ order by job,empno,date desc; //实际上只是查询出符合job=’manager’and empno=’10’条件的记录并按date降序排列 //job,empno的出现是为了使用索引,不引发全表扫描 //只写成order by date desc引发全表扫描,性能较差。
-
列操作
select * from table where column + 1 = 2这里对column进行了列操作,加1以后,与column索引里的内容对不上,导致column不走索引,走了全表扫描。
修改方式也很简单,把+1移到右边,即:select * from table where column = 2-1①select * from table where column = 123 --这里的column是varchar类型
②select * from table where column = ‘123’ --这里的column是number类型
隐式的类型转换:字符->整数
①中列的类型被转换,导致索引失效,走了全表扫描参考:https://blog.youkuaiyun.com/XiaoXiao_RenHe/article/details/78668584
https://www.cnblogs.com/attlia/p/3674569.html注:何时适用全表扫描(正面)
1.单表查询
表很小,索引可能就比表还大;
访问的数据占全表数据的百分比很大,索引访问的总成本大于全表扫描的成本;
相对于索引来说,表中的数据排列过于凌乱,表现出来就是索引的 clustering_factor 很大,
导致索引的访问成本剧增。2.多表连接
hash join的时候,内层表和外层表都可以使用全表扫描(对于某个单独的表的访问是否适用全表扫描,这个又回到了单表查询的情况);
nest loop的时候,外层表可以使用全表扫描,内层表一般不用全表扫描。