数据库索引失效

今天一个同事突然问我索引为什么失效。说实在的,失效的原因有多种:

但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况:

1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表)

2. 统计信息失效      需要重新搜集统计信息

3. 索引本身失效      需要重建索引

下面是一些不会使用到索引的原因

索引失效
1) 没有查询条件,或者查询条件没有建立索引
2) 在查询条件上没有使用引导列
3) 查询的数量是大表的大部分,应该是30%以上。
4) 索引本身失效
5) 查询条件使用函数在索引列上(见12)
6) 对小表查询
7) 提示不使用索引
8) 统计数据不真实
9) CBO计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。
10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),
但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效.
错误的例子:select * from test where tu_mdn=13333333333;
正确的例子:select * from test where tu_mdn=‘13333333333‘;
11)对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)
错误的例子:select * from test where id-1=9;
正确的例子:select * from test where id=10;
12)使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引.
错误的例子:select * from test where round(id)=10;
说明,此时id的索引已经不起作用了 正确的例子:首先建立函数索引,
create index test_id_fbi_idx on test(round(id));
然后 select * from test where round(id)=10; 这时函数索引起作用了 1,<> 2,单独的>,<,(有时会用到,有时不会)
3,like "%_" 百分号在前.
4,表没分析.
5,单独引用复合索引里非第一位置的索引列.
6,字符型字段为数字时在where条件里不添加引号.
7,对索引列进行运算.需要建立函数索引.
8,not in ,not exist.
9,当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
10, 索引失效。
11,基于cost成本分析(oracle因为走全表成本会更小):查询小表,或者返回值大概在10%以上
12,有时都考虑到了 但就是不走索引,drop了从建试试在
13,B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走
14,联合索引 is not null 只要在建立的索引列(不分先后)都会走,
in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,
其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),
或者=一个值;当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),
以上两种情况索引都会走。其他情况不会走。

时间: 2024-11-05 15:05:22

数据库索引失效的相关文章

数据库索引失效的一种场景:分析问题的思路和策略

这是公司研发团队发现的一个关于数据库索引失效方面的问题,我们的工程师对该问题进行了分析和解决并写了这份小结.归根揭底还是对开发框架和技术应用的把握上存在纰漏,但个人觉得在分析问题->找出原因->确认解决方案这一思路和策略上本文能起到一定借鉴作用,所以稍微梳理了一下拿出来和大家分享. 问题的现状是测试人员反馈某一个功能操作耗时很长(需要20秒以上),而开发人员核对代码发现无论从业务逻辑上还是代码实现上都没有问题,涉及到的数据查询等功能在数据库中也创建了合适的索引以确保查询效率,于是我们的工程师就

数据库索引失效原因

1.应尽量避免在where子句中使用!=或者<>操作符,否则引擎将放弃使用索引而进行全表扫描. 2.尽量避免在where子句中使用or来链接条件,否则将导致引擎放弃使用索引而进行全表扫描,即使其中有条件带索引也不会使用,这也是为什么尽量少使用or的原因. 3.对于多列索引,应满足最左匹配原则: 4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引. 5.link的模式查询以%开头,索引失效. 6.应尽量避免在wher子句中对字段进行表达式操作,这将导致引擎放弃使用索

sql server数据库中索引失效的问题讨论

有关于数据库中索引失效的问题,网上也有相关的讨论.不过他们是针对oracle数据库进行讨论的.那么在sql server数据库中索引什么时候 会失效呢.总结了一下,不过我没有经过测试.没测试就没有发言权,这里仅供自己参考. 首先,所谓失效.并不真的就是这个索引被删除了.而是在这些情况下,DBMS不会检索索引列表了.执行速度和没有这个索引时的速度一样. 但是再执行另外的一条语句.同样索引可以正常起作用.所以索引的失效是针对某条sql语句的,而不是针对索引本身的.那么在哪些情况下, 确切的说是在哪类

记录数据库中索引失效的问题

昨天碰到一个很有意思的问题,一个sql 语句,加上 SoftUseLine like '%OQC%' 之后,速度就特别慢.去掉该条件之后,速度就快起来了. 查看sql 语句的执行情况,发现加上那个查询条件之后,SoftWareDetailInfo表的逻辑读取变成了1300374 次, 可是这个查询字段明明已经加上Index_SoftWareDetail索引了,怎么会逻辑读取还这么大呢.查看sql profile 的详细信息,发现sql 语句,没有走那个索引. 于是,加上WITH(INDEX(In

数据库----问题1:数据库索引底层是怎样实现的,哪些情况下索引会失效?

什么是索引: 一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree).索引是在表的列上创建.所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中.请记住记住这一点:索引是一种数据结构 . 哈希索引的缺点: 优点:在寻找值时哈希表效率极高,如果使用哈希索引,对于比较字符串是否相等的查询能够极快的检索出的值. 缺点:哈希表是无顺的数据结构,对于很多类型的查询语句哈希索引都无能为力.比如无法查询所有小于40岁的员工.因为哈希表只适合查询键值对-也就是说查询相等的查

Oracle数据库索引使用及索引失效总结

容易引起oracle索引失效的原因很多: 1.在索引列上使用函数.如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了. 2.新建的表还没来得及生成统计信息,分析一下就好了 3.基于cost的成本分析,访问的表过小,使用全表扫描的消耗小于使用索引. 4.使用<>.not in .not exist,对于这三种情况大多数情况下认为结果集很大,一般大于5%-15%就不走索引而走FTS. 5.单独的>.<. 6.like "%_"

数据库 索引

1.索引定义 百科:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 分析:索引是一种排序的结构:它需要对数据项建立索引并存储在物理空间中. 不同的索引类型和数据库,索引的建立和索引的查找机制会有所不同. 索引的作用就是加快查找的速度. 同时,由于在插入数据.修改数据时会创建索引或修改索引,因此会消耗数据库的性能和存储空间. 2.索引的分类 2.1 聚簇索引(clustered index) 2.1.1 创建聚簇索引 create clustered

数据库索引介绍及使用【转】

数据库索引介绍及使用 一.索引的概念 索引就是加快检索表中数据的方法.数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库. 二.索引的特点 1.索引可以加快数据库的检索速度 2.索引降低了数据库插入.修改.删除等维护任务的速度 3.索引创建在表上,不能创建在视图上 4.索引既可以直接创建,也可以间接创建 5.可以在优化隐藏中,使用索引 6.使用查询处理器执行SQL语句,在一个表

MongoDB数据库索引

前面的话 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的.本文将详细介绍MongoDB数据库索引 引入 索引能够提高查询效率,如何体现呢?接下来使用性能分析函数explain()来进行分析说明 首先,插入10万条数据 接着,不创建索引,来寻找time范围在100和200之间的文档 由图中所知,tot