遇到的数据库面试题,应该一直更新中

1.哪些操作会引起全表扫描——>引起全表扫描的SQL语句

对于全表的查询和操作

  1. 没有设置查询条件,即全表查询 select * from tablename ; select count(*) from table
  2. Update 语句改全字段
    如果只更改1、2个字段,不要Update全部字段
  3. join连接表

索引失效,只能走全表扫描

  1. 模糊查询:
    只有右模糊‘…%'可以成功利用索引;
    左模糊‘%…'和全模糊‘%…%'都不能成功利用索引。

  2. 查询条件
    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都使用了索引,索引才会有效,否则导致索引失效

  3. 组合索引使用不当
    查询条件中没有前导列,导致索引不起作用;

    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引发全表扫描,性能较差。
    
  4. 列操作
    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的时候,外层表可以使用全表扫描,内层表一般不用全表扫描。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值