网易首页 > 网易号 > 正文 申请入驻

索引失效的场景有哪些?索引何时会失效?

0
分享至

虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引。下面是引起这种问题的几个关键点。

列与列对比

某个表中,有两列(id和c_id)都建了单独索引,下面这种查询条件不会走索引

select * from test where id=c_id;

这种情况会被认为还不如走全表扫描。

存在NULL值条件

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

如果索引列是可空的,很可能是不会给其建索引的,索引值是少于表的值的,所以这种情况下,执行计划自然就去扫描全表了。

count(*)
select * from test where id is not null;

NOT条件

我们知道建立索引时,给每一个索引列建立一个条目,如果查询条件为等值或范围查询时,索引可以根据查询条件去找对应的条目。

反过来当查询条件为非时,索引定位就困难了,执行计划此时可能更倾向于全表扫描,这类的查询条件有:、<>、NOT、in、not exists

select * from test where id<>500;
select * from test where id in (1,2,3,4,5);
select * from test where not in (6,7,8,9,0);
select * from test where not exists (select 1 from test_02 where test_02.id=test.id);

LIKE通配符

当使用模糊搜索时,尽量采用后置的通配符,例如:name||’%’,因为走索引时,其会从前去匹配索引列,这时候是可以找到的,如果采用前匹配,那么查索引就会很麻烦,比如查询所有姓张的人,就可以去搜索’张%’。

相反如果你查询所有叫‘明’的人,那么只能是%明。这时候索引如何定位呢?前匹配的情况下,执行计划会更倾向于选择全表扫描。后匹配可以走INDEX RANGE SCAN。

所以业务设计的时候,尽量考虑到模糊搜索的问题,要更多的使用后置通配符。

select * from test where name like 张||'%';

条件上包括函数

查询条件上尽量不要对索引列使用函数,比如下面这个SQL

select * from test where upper(name)='SUNYANG';

这样是不会走索引的,因为索引在建立时会和计算后可能不同,无法定位到索引。但如果查询条件不是对索引列进行计算,那么依然可以走索引。比如

select * from test where name=upper('sunyang');
--INDEX RANGE SCAN

这样的函数还有:to_char、to_date、to_number、trunc等。搜索公众号Java知音,回复“2021”,送你一份Java面试题宝典

复合索引前导列区分大

当复合索引前导列区分小的时候,我们有INDEX SKIP SCAN,当前导列区分度大,且查后导列的时候,前导列的分裂会非常耗资源,执行计划想,还不如全表扫描来的快,然后就索引失效了。

select * from test where owner='sunyang';

数据类型的转换

当查询条件存在隐式转换时,索引会失效。比如在数据库里id存的number类型,但是在查询时,却用了下面的形式:

select * from sunyang where id='123';

Connect By Level

使用connect by level时,不会走索引。

谓词运算

我们在上面说,不能对索引列进行函数运算,这也包括加减乘除的谓词运算,这也会使索引失效。建立一个sunyang表,索引为id,看这个SQL:

select * from sunyang where id/2=:type_id;

这里很明显对索引列id进行了’/2’除二运算,这时候就会索引失效,这种情况应该改写为:

select * from sunyang where id=:type_id*2;

就可以使用索引了。

Vistual Index

先说明一下,虚拟索引的建立是否有用,需要看具体的执行计划,如果起作用就可以建一个,如果不起作用就算了。

普通索引这么建:

create index idx_test_id on test(id);

虚拟索引Vistual Index这么建:

create index idx_test_id on test(id) nosegment;

做了一个实验,首先创建一个表:

CREATE TABLE test_1116(
id number,
a number

CREATE INDEX idx_test_1116_id on test_1116(id);
CREATE INDEX idx_test_1116_a on test_1116(a)nosegment;

其中id为普通索引,a为虚拟索引。

在表中插入十万条数据

begin
for i in 1 .. 100000 loop
insert into test_1116 values (i,i);
end loop;
commit;
end;

接着分别去执行下面的SQL看时间,由于在内网机做实验,图贴不出来,数据保证真实性。

select count(id) from test_1116;
--第一次耗时:0.061秒
--第二次耗时:0.016秒

select count(a) from test_1116;
--第一次耗时:0.031秒
--第二次耗时:0.016秒

因为在执行过一次后,oracle对结果集缓存了,所以第二次执行耗时不走索引,走内存就都一样了。可以看到在这种情况下,虚拟索引比普通索引快了一倍。

具体虚拟索引的使用细节,这里不再展开讨论。

Invisible Index

Invisible Index是oracle 11g提供的新功能,对优化器(还接到前面博客里讲到的CBO吗)不可见,我感觉这个功能更主要的是测试用,假如一个表上有那么多索引,一个一个去看执行计划调试就很慢了,这时候不如建一个对表和查询都没有影响的Invisible Index来进行调试,就显得很好了。

通过下面的语句来操作索引

alter index idx_test_id invisible;
alter index idx_test_id visible;

如果想让CBO看到Invisible Index,需要加入这句:

alter session set optimizer_use_invisible_indexes = true;

基本就这些了,有问题欢迎留言指出,共同进步!

来源 | http://blog.csdn.net/bless2015/article/details/84134361

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
传万科高管被要求退薪

传万科高管被要求退薪

罗恩财经
2026-03-30 18:36:11
中国电磁炮专家,竟是美国间谍,出卖大量情报,让国家损失惨重

中国电磁炮专家,竟是美国间谍,出卖大量情报,让国家损失惨重

青烟小先生
2026-03-02 17:17:14
致命!35岁中国男子殒命日本...

致命!35岁中国男子殒命日本...

今日日本
2026-03-30 14:39:05
卡位战,斯普利特:下轮对阵快船是本赛季最重要的一场比赛

卡位战,斯普利特:下轮对阵快船是本赛季最重要的一场比赛

懂球帝
2026-03-30 11:16:21
高盛:市场悲观情绪接近极限 一旦战争局势降温股市或大幅反弹

高盛:市场悲观情绪接近极限 一旦战争局势降温股市或大幅反弹

财联社
2026-03-30 18:45:05
8天7个涨停板!股民:妖股让人惊喜连连!

8天7个涨停板!股民:妖股让人惊喜连连!

数据挖掘分析
2026-03-30 15:15:57
卡塔尔公主到访京东美术馆 章泽天与京东CEO许冉陪同

卡塔尔公主到访京东美术馆 章泽天与京东CEO许冉陪同

快科技
2026-03-30 09:29:05
欧美股市全线下跌,油价再度飙升7%,纳斯达克指数下跌459点

欧美股市全线下跌,油价再度飙升7%,纳斯达克指数下跌459点

投资观
2026-03-30 07:10:03
养老公寓爆雷后:公职人员提前退资全身而退?老人们放弃追责转向追赃

养老公寓爆雷后:公职人员提前退资全身而退?老人们放弃追责转向追赃

澎湃新闻
2026-03-30 12:59:52
当不成总统了?美国迎三大噩耗,百万人逼宫,他承认对中国上头了

当不成总统了?美国迎三大噩耗,百万人逼宫,他承认对中国上头了

知法而形
2026-03-29 11:53:37
王石不装了,头套也不戴了,直接光头,不敢喝酒,只喝茶

王石不装了,头套也不戴了,直接光头,不敢喝酒,只喝茶

西楼知趣杂谈
2026-03-02 09:44:56
1982年血色使馆:中国外交官唐健生为了生存杀光了所有同事

1982年血色使馆:中国外交官唐健生为了生存杀光了所有同事

阿校谈史
2026-03-20 11:03:27
一场3-1让王皓大喜!马龙接班人29岁还能挑大梁吗?王楚钦对手弱

一场3-1让王皓大喜!马龙接班人29岁还能挑大梁吗?王楚钦对手弱

曹说体育
2026-03-30 12:37:53
面对市场大跌,散户该如何应对?

面对市场大跌,散户该如何应对?

睿知投资
2026-03-23 12:54:58
生育大局已定:如不出意外,2026年起中国人口将迎来3大变化

生育大局已定:如不出意外,2026年起中国人口将迎来3大变化

蜉蝣说
2026-03-17 15:58:31
江苏沸腾了!这两大重点工程迎来新进展↓

江苏沸腾了!这两大重点工程迎来新进展↓

荷兰豆爱健康
2026-03-30 16:30:13
协和心外科主任55万投贵州茅台,20年净赚1100万,终获时间馈赠

协和心外科主任55万投贵州茅台,20年净赚1100万,终获时间馈赠

真实人物采访
2026-03-30 07:35:03
平成时代女演员的巅峰时期真是令人惊叹

平成时代女演员的巅峰时期真是令人惊叹

东京新青年
2026-03-29 15:35:04
87岁李昌钰去世,留下“巨额”遗产分配曝光,两子女决定让人意外

87岁李昌钰去世,留下“巨额”遗产分配曝光,两子女决定让人意外

云舟史策
2026-03-30 17:01:12
3.6万亿某系轰然崩塌,资产仅剩残渣,昔日“中国黑石”终成不良资产

3.6万亿某系轰然崩塌,资产仅剩残渣,昔日“中国黑石”终成不良资产

新浪财经
2026-03-30 16:08:53
2026-03-30 19:43:00
互联网干货博主
互联网干货博主
我是专注分享互联网干货的博主
278文章数 1340关注度
往期回顾 全部

科技要闻

一句谎言引发的硅谷血案

头条要闻

河南女子举报母亲去世后被结婚 官方通报

头条要闻

河南女子举报母亲去世后被结婚 官方通报

体育要闻

想进世界杯,意大利还要过他这一关

娱乐要闻

单依纯凌晨发长文道歉!李荣浩再回应

财经要闻

本轮地缘冲突,A股凭什么走出独立行情

汽车要闻

理想i9要来了!外形似小号MEGA 能冲击高端纯电市场?

态度原创

房产
时尚
教育
数码
旅游

房产要闻

重磅!番禺20宗涉宅地亮相,万博CBD宅地将上新!

来到1980的周也,好毛利兰

教育要闻

“给你女儿买件好内衣吧!”中学女孩锻炼视频,网友都看不下去了

数码要闻

性能最强的锐龙AI 9 H 465轻薄本!华硕无畏Pro16锐龙版2026评测

旅游要闻

上海迪士尼地球月系列活动即将开启,启迪每个人亲近自然、推动野生动植物保护

无障碍浏览 进入关怀版