首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >索引失效的场景有哪些?索引何时会失效?

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

作者头像
用户2242639
发布于 2021-11-04 02:47:58
发布于 2021-11-04 02:47:58
59500
代码可运行
举报
文章被收录于专栏:Java经验总结Java经验总结
运行总次数:0
代码可运行

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

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

列与列对比

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from test where id=c_id;

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

存在NULL值条件

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from test where id is not null;

NOT条件

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from test where name like 张||'%';

条件上包括函数

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from test where upper(name)='SUNYANG';

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from test where name=upper('sunyang');
--INDEX RANGE SCAN

这样的函数还有:to_char、to_date、to_number、trunc等。

复合索引前导列区分大

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from test where owner='sunyang';

数据类型的转换

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from sunyang where id='123';

Connect By Level

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

谓词运算

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from sunyang where id/2=:type_id;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from sunyang where id=:type_id*2;

就可以使用索引了。

Vistual Index

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

普通索引这么建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create index idx_test_id on test(id);

虚拟索引Vistual Index这么建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create index idx_test_id on test(id) nosegment;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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为虚拟索引。

在表中插入十万条数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin 
for i in 1 .. 100000 loop 
        insert into test_1116 values (i,i); 
end loop; 
commit; 
end; 

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select count(id) from test_1116;
--第一次耗时:0.061--第二次耗时:0.016
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select count(a) from test_1116; 
--第一次耗时:0.031--第二次耗时:0.016

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

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

Invisible Index

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter index idx_test_id invisible;
alter index idx_test_id visible;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter session set optimizer_use_invisible_indexes = true;

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java经验总结 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何基于DataX做增量数据同步?
一、DataX数据同步原理二、全量同步实现三、增量同步的思考四、增量同步实现方案五、关于DataX高可用参考
叔牙
2023/06/21
6.8K0
如何基于DataX做增量数据同步?
DataX数据同步实战案例
DataX 是阿里云DataWorks数据集成的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS 等各种异构数据源之间高效的数据同步功能。
chimchim
2022/11/13
2.4K0
DataX数据同步实战案例
dataX是阿里开源的离线数据库同步工具的使用
DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
凯哥Java
2022/12/16
1.4K0
dataX是阿里开源的离线数据库同步工具的使用
【Spark数仓项目】需求八:MySQL的DataX全量导入和增量导入Hive
本需求将模拟从MySQL中向Hive数仓中导入数据,数据以时间分区。测试两种导入场景,一种是将数据全量导入,即包含所有时间分区;另一种是每天运行调度,仅导入当天时间分区中的用户数据。
火之高兴
2024/07/25
5110
【知识】ETL大数据集成工具Sqoop、dataX、Kettle、Canal、StreamSets大比拼
对于数据仓库,大数据集成类应用,通常会采用ETL工具辅助完成。ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、交互转换(transform)、加载(load)至目的端的过程。当前的很多应用也存在大量的ELT应用模式。常见的ETL工具或类ETL的数据集成同步工具很多,以下对开源的Sqoop、dataX、Kettle、Canal、StreamSetst进行简单梳理比较。
辉哥
2022/05/13
15.3K0
【知识】ETL大数据集成工具Sqoop、dataX、Kettle、Canal、StreamSets大比拼
分布式数据同步工具之DataX-Web部署使用
背景介绍,因为需求是外部数据和内部生产数据之间需要通步,因此dataworks的数据同步模块的源端和目标是不支持多网络环境,要么公网,要么内网,因此这种需求我们的dataworks是不能使用的,我们调研了两个工具,一个是dataxweb ,一个是dolphinscheduler ,今天的篇幅主要讲解一下搭建的dataxweb的流程。
大数据技术架构
2022/12/01
10.4K0
分布式数据同步工具之DataX-Web部署使用
大数据平台 - 数据采集及治理
ETL基本上就是数据采集的代表,包括数据的提取(Extract)、转换(Transform)和加载(Load)。数据源是整个大数据平台的上游,数据采集是数据源与数仓之间的管道。在采集过程中针对业务场景对数据进行治理,完成数据清洗工作。
端碗吹水
2020/11/16
3.8K0
大数据平台 - 数据采集及治理
datax详细介绍及使用
DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、SQL Server、Oracle、PostgreSQL、HDFS、Hive、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。
Maynor
2022/03/11
12.6K0
datax详细介绍及使用
Datax安装及基本使用
http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
刘大猫
2025/07/04
1420
DataX 实现 MySQL 数据,高效同步
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/07/12
4.1K0
DataX 实现 MySQL 数据,高效同步
TBDS大数据集群迁移实践总结
这次迁移算是TBDS集群的第一次完整迁移案例,包括用户的业务数据,平台应用,从项目启动到最后完成迁移差不多耗费了1个月的时间。
mikealzhou
2018/12/13
4.2K0
大数据实训之数据可视化系列教程
https://github.com/alibaba/DataX/blob/master/introduction.md
张哥编程
2024/12/07
1650
datax实现mysql数据同步
DataX 是阿里内部广泛使用的离线数据同步工具/平台,可以实现包括 MySQL、Oracle、HDFS、Hive、OceanBase、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。DataX采用了框架 + 插件 的模式,目前已开源,代码托管在github
全栈程序员站长
2022/08/30
4.7K0
datax实现mysql数据同步
Airflow自定义插件, 使用datax抽数
Airflow之所以受欢迎的一个重要因素就是它的插件机制。Python成熟类库可以很方便的引入各种插件。在我们实际工作中,必然会遇到官方的一些插件不足够满足需求的时候。这时候,我们可以编写自己的插件。不需要你了解内部原理,甚至不需要很熟悉Python, 反正我连蒙带猜写的。
Ryan-Miao
2019/10/01
3.4K0
[DataX引擎配置错误,该问题通常是由于DataX安装错误引起,请联系您的运维解决 .]. - 在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数
[DataX引擎配置错误,该问题通常是由于DataX安装错误引起,请联系您的运维解决 .].  - 在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数
chimchim
2023/10/17
3.8K0
[DataX引擎配置错误,该问题通常是由于DataX安装错误引起,请联系您的运维解决 .]. - 在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数
【YashanDB知识库】DataX迁移Hive到崖山分布式
python bin/datax.py job/hive2yashandb.json
用户10349277
2025/03/03
920
【踩坑实录】-bucketId out of range: -1 (state=,code=0)
java.io.IOException: java.lang.IllegalArgumentException: Bucket ID out of range: -1
chimchim
2022/11/13
9270
异构数据源同步之数据同步 → DataX 使用细节
里面讲到了 DataX 的概况、框架设计、核心架构、插件体系、核心优势,由阿里出品,并在阿里内部被广泛使用,其性能、稳定都是经过了严格考验的。得益于它的框架设计
青石路
2024/06/05
2.4K0
异构数据源同步之数据同步 → DataX 使用细节
开源DataX集成可视化项目Datax-Web的使用
1、"调度中心OnLine:"右侧显示在线的"调度中心"列表, 任务执行结束后, 将会以failover的模式进行回调调度中心通知执行结果, 避免回调的单点风险;
星哥玩云
2023/04/01
9.8K0
开源DataX集成可视化项目Datax-Web的使用
Ubuntu下安装Datax-web数据交换平台
为了实现两个数据库之间的数据交换,企业级有ODI等,此处尝试DataX做小型数据交换。
geekfly
2022/08/11
1K0
Ubuntu下安装Datax-web数据交换平台
推荐阅读
相关推荐
如何基于DataX做增量数据同步?
更多 >
交个朋友
加入[数据] 腾讯云技术交流站
获取数据实战干货 共享技术经验心得
加入数据技术工作实战群
获取实战干货 交流技术经验
加入[数据库] 腾讯云官方技术交流站
数据库问题秒解答 分享实践经验
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档