不走索引的一些情形——替你们躺过的坑

本文详细分析了数据库查询中不走索引的一些情况,包括列与列对比、存在NULL值条件、IN操作符、不等于运算符、ORDER BY、NOT条件、LIKE通配符、条件上包含函数、复合索引问题、隐式转换、Oracle特有的Connect By Level以及虚拟索引等。了解这些情况有助于优化查询性能,避免全表扫描。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

列与列对比

某个表中,有两列(id和c_id)都建了单独索引,下面这种查询条件不会走索引
select * from test where id=c_id;
这种情况会被认为还不如走全表扫描。测试如下

explain select * from product where PRODUCT_ID =100101 ;

在这里插入图片描述
当有两个带索引的列比较时
在这里插入图片描述

存在NULL值条件

我们在设计数据库表时,应该尽力避免NULL值出现,如果非要不可避免的要出现NULL值,也要给一个DEFAULT值,数值型可以给0、-1之类的, 字符串有时候给空串有问题,就给一个空格或其他。

**单键值的b树索引列上存在null值,导致COUNT(*)不能走索引。** 

解决方法:如果在B树索引中有一个空值,那么查询诸如SELECT COUNT(*) FROM T 的时候,因为HASHSET中不能存储空值的,所以优化器不会走索引,有两种方式可以让索引有效,一种是SELECT COUNT(*) FROM T WHERE XXX IS NOT NULL或者把这个列的属性改为not null (不能为空)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值