-
2022-01-28 17:03:56
什么是索引失效:
使用索引查询某行数据,但数据库扫描全表进行查询时 叫索引失效;
查询sql是否命中索引的关键字 explain
explain SELECT * FROM sms_black_list where id = 74
索引失效的几种方式:
1、where中存在 or
2、类型为char,查询条件时用int
3、模糊查询时,%开头的查询
4、not in
5、where索引列有运算
6、where中索引列使用了函数
为什么要用索引:
提升查询性能 ,缩短查询时间
场景:8千万数据的表中查询一行数据,没有索引查询耗时500s+,使用索引查询耗时0.03s
更多相关内容 -
数据库索引失效的几种情况
2020-12-14 12:05:27二、索引失效的几种情况 1.如果条件中有多个字段使用or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。多条件查询用同一字段时使用or索引会生效。 注意:要想使用or,又想让索引生效,只能... -
oracle数据库索引失效
2020-09-10 10:58:59主要介绍了oracle数据库索引失效的原因及如何避免索引失效,有需要的小伙伴参考下。 -
数据库索引失效原因分析
2021-11-19 11:45:20模糊查询时,like查询如果以%开头,则索引失效 eg: select name from test where name like ‘%dd’ 2、型: 表示数据类型错误,比如数据库字段类型是varchar,但你的查询where 后边加的是一个number类型的,索引也...总结:模 型 数 空 运 最 快
1、模:
模糊查询时,like查询如果以%开头,则索引失效
eg: select name from test where name like ‘%dd’
2、型:
表示数据类型错误,比如数据库字段类型是varchar,但你的查询where 后边加的是一个number类型的,索引也会失效
eg: select name from test where height =180; heigth是varchar类型的所有会索引失效(这种情况可以建立基于函数的索引,就不会失效了)
3、数:
表示函数,对索引的字段使用内部函数,索引也会失效
eg: select name from test where DATE(create_time)=‘2020-01-01’
4、空:
表示Null,索引是不存储空值的,如果不限制索引列默认都是not null,如果对字段进行判空,数据库会认为这个索引列可能有空值,所以不会按照索引列进行计算(设计数据库字段的时候如果没有要求字段必须为null,最后给这个字段设置一个默认值字符串)
eg:select age from test where name is null
select age from test where name is not null
5、运:
表示运算,对索引列进行计算(+ - * / ! != <>)等运算,会导致索引失效
eg:select name from test where age-1=20;
6、最:
表示最左原则,在复合索引中索引列的顺序至关重要,如果不是按照索引的最左列开始查找,则无法使用索引。
7、快:
全表扫描更快的意思,如果数据库预计使用全表扫描要比使用索引快,则不适用索引。
(什么情况下全表扫描比索引扫描效率更高)
查询结果的记录数量小于表中记录一定比例的时候。这个主要是由于索引扫描后要利用索引中的指针去逐一访问记录,假设每个记录都使用索引访问,则读取磁盘的次数是查询包含的记录数T,而如果表扫描则读取磁盘的次数是存储记录的块数B,如果T>B 的话索引就没有优势了。对于大多数数据库来说,这个比例是10%(oracle,postgresql等),即先对结果数量估算,如果小于这个比例用索引,大于的话即直接表扫描 -
数据库索引失效的一些场景
2021-04-07 16:47:28二、索引失效的场景 一、概述 为了提高数据库SQL语句执行效率,我们第一时间想到的就是,通过在表上建立一些合适的索引。但是有时候我们明明在列上面创建了索引,查询条件也用到了该列,但是通过查询执行计划的...目录
一、概述
为了提高数据库SQL语句执行效率,我们第一时间想到的就是,通过在表上建立一些合适的索引。但是有时候我们明明在列上面创建了索引,查询条件也用到了该列,但是通过查询执行计划的时候,却发现没有走索引查询。本篇文章我们将总结一些常见的索引的失效场景。
二、索引失效的场景
【a】存在NULL值条件
在设计数据库时,我们应该尽量避免某个列的值为空,如果非要不可避免的要出现NULL值,我们可以给它一个DEFAULT值,比如-1等。如果索引列是可空的,是不会给其建立索引的,这种情况下,索引值是少于表的count(*)总记录数的,所以这种情况下可能导致索引用不上,而是进行全表扫描。如下示例:
【b】索引使用不满足最左前缀匹配原则
- 如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引;
- 如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引
假如表建立了一个联合索引(a、b、c)三列,如果在查询条件中没有使用到最左边的索引列a,那么可能导致索引失效。如下示例:
--能利用索引 select * from test where a = 1 and b = 2 and c = 3; --不能利用索引 select * from test where b = 2 and c = 3
注意:索引一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整
【c】使用前置LIKE模糊查询
模糊搜索时,尽量采用后置%,因为走索引时,其会从头开始去匹配索引列,这时候是可以找到的,如果采用前%,那么查索引就会比较麻烦。这时候索引如何定位呢?前%的情况下,执行计划会更倾向于选择全表扫描,使用后%的话执行计划可以走INDEX RANGE SCAN索引范围扫描,能利用上索引。
所以业务设计的时候,尽量考虑到模糊搜索的问题,要尽可能使用后置%。如下示例:--oracle下 select * from zhxg_zhcp_cpmb t1 where t1.cpxmc like '德育' || '%'; --尽量不使用前% select * from zhxg_zhcp_cpmb t1 where t1.cpxmc like '%' || '德育'; --mysql下 SELECT * FROM `account_info` t WHERE t.`account_name` LIKE '张%' --尽量不使用前% SELECT * FROM `account_info` t WHERE t.`account_name` LIKE '%张'
【d】隐式类型转换
当查询条件存在隐式转换时,索引可能会失效。如下示例: tx_no在数据库是varchar类型,但是我们传入的参数却使用了int或者bigint其他类型。
--tx_no VARCHAR(64) SELECT * FROM `account_trans_record` t WHERE t.`tx_no` = 123
【e】where条件进行函数运算[to_char、to_date、upper、lower、to_number、trunc等函数]
如果我们的查询条件中包含对索引列的函数运算的话,可能导致执行计划进行全表扫描。如下示例:
select * from zhxg_zhcp_cpmb t1 where upper(t1.cpxmc) = 'ZHANGSAN';
相反,如果查询条件不是对索引列进行计算,那么依然可以走索引。比如我们将函数运算移到等于号右边,这样是可以利用上索引的。
select * from zhxg_zhcp_cpmb t1 where t1.cpxmc = upper('zhangsan')
【f】not in、not exists等
我们知道建立索引时,给每一个索引列建立一个条目,如果查询条件为等值或范围查询时,索引可以根据查询条件去找对应的条目。反过来当查询条件为非时,索引定位就相对困难,执行计划此时可能更倾向于全表扫描,这类的查询条件有:<>、NOT、in、not exists。如下示例:
--<> select * from zhxg_zhcp_cpmb t1 where t1.cpxid <> '6d4c1af7-3fb4-45a1-b555-3db8246e2ad5'; --in select * from zhxg_zhcp_cpmb t1 where t1.cpxid in ('6d4c1af7-3fb4-45a1-b555-3db8246e2ad5', '5fbea6c3-a367-4c51-beeb-9dbeb7d9b308'); --not in select * from zhxg_zhcp_cpmb t1 where t1.cpxid not in ('6d4c1af7-3fb4-45a1-b555-3db8246e2ad5', '5fbea6c3-a367-4c51-beeb-9dbeb7d9b308'); --not exists select * from zhxg_zhcp_cpmb t1 where not exists (select 1 from zhxg_zhcp_hjbd t2 where t1.cpxid = t2.cpxid);
【g】查询条件进行谓词运算
这种情况,跟前面说到的函数运算差不多,如果我们确实需要对索引列进行谓词运算,我们尽量把计算移到=右边,即尽量不要对索引列进行谓词运算。如下示例:SELECT * FROM `account_info` t WHERE id / 2 = 2; --优化成下面: SELECT * FROM `account_info` t WHERE id = 4;
本文只是总结了常见的一些索引失效的场景,当然肯定还有其他很多种情况,欢迎大家一起补充其他索引失效的场景。由于笔者水平有限,如上文有不对之处,还请指正。
-
面试题:数据库索引失效的条件
2021-12-02 16:46:123.索引列上进行运算操作索引失效 4.字符串不加单引号,索引失效(底层进行运算操作) 5.使用or分隔开的条件,如果or前的条件有索引而or后面列没有索引,那么都不会走索引 6.以%号开头的Like模糊查询,索引失效(尾部...1.不符合最左前缀法则(查询从索引的最左列开始不跳过中间的列)
2.范围查询右边的列不走索引
3.索引列上进行运算操作索引失效
4.字符串不加单引号,索引失效(底层进行运算操作)
5.使用or分隔开的条件,如果or前的条件有索引而or后面列没有索引,那么都不会走索引
6.以%号开头的Like模糊查询,索引失效(尾部模糊匹配索引不会失效)。
7. 如果走全表扫描比走索引快则走全表扫描。 (比如我以address列作为索引,sql底层发现大部分都是北京市,那还不如走全表扫描)
8.is null和is not null 可能会走索引可能不会走。比如我这一列里面基本上没有null,那么is null就走索引,is not null走全表扫描。
9.in走索引,not不走索引 -
数据库索引失效的情况
2021-03-07 22:56:16我们在设计数据库时尽量避免NULL值的出现,如果不可避免地要出现NULL值的情况,也要这是默认值,比如数值类型的可以设置为0或者-1,字符串可以设成空字符串或者其他的东西。 如果索引列是可空的,是不会给其创建... -
数据库索引的优缺点以及什么时候数据库索引失效
2019-04-26 14:31:181. 什么是索引: 索引就像是书的目录,是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引中包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(BTree)中,使SQL可以快速有效地... -
数据库索引失效
2020-04-15 18:08:13索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有多个字段使用or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。同一字段使用or时,索引会生效 注意:要想... -
数据库索引失效情况
2022-03-29 10:55:15戳这里,加关注哦~索引在我们使用MySQL数据库时可以极大的提高查询效率,然而,有时候因为使用上的一些瑕疵就会导致索引的失效,无法达到我们使用索引的预期效果,今天介绍几种MySQL中几种常见的索引失效的原因,... -
常见的数据库索引失效原因
2020-09-15 20:26:48常见的数据库索引失效原因 在给表建立关联索引时候,需要注意从左到右匹配索引。否则索引失效。 查询的条件和索引的类型不一致失效。 使用!= 或者<> 等特殊符号索引失效。 使用函数索引失效。 使用运算符号... -
数据库索引失效问题
2020-07-27 17:21:45通过创建唯一性索引,可以保证给数据库表中每一行数据的唯一性。 可以大大加快数据检索速度,也就是创建索引的最主要原因 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意. -
MySQL数据库索引失效的情况
2022-04-30 16:23:46文章转载自MySQL数据库索引失效 数据表结构如下: 索引失效与优化 1.全值匹配 2.最佳左前缀法则 3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描 4.存储引擎不能... -
Oracle数据库索引失效
2021-05-03 02:25:07Oracle数据库中有一个表,用PL/SQL查看该表的索引没有被DROP掉, 但是表上的数据查询起来很慢(查询时间大概是原来的3倍),后Oracle数据库中有一个表,用PL/SQL查看该表的索引没有被DROP掉,, 但是表上的数据查询... -
数据库索引失效情况汇总
2021-12-01 12:36:39“模型数空运最快” 模:模糊查询,百分号开头,索引失效,尽量避免该种查询 型:数据类型不一致,索引失效,将参数转化类型后再进行比较 数:对索引字段使用函数运算...快:数据库认为使用全表扫描更快,索引失效 ... -
MySQL数据库索引及失效场景
2022-01-06 14:13:11MySQL数据库索引及失效场景1. 索引失效概述1.1 索引的概念1.2 索引的特点1.3 索引的分类1.4 索引的使用场景2. 索引失效场景2.1 常见索引失效的9种情况2.2 索引失效场景总结3. 索引失效验证3.1 全值匹配3.2 最佳左... -
MySQL数据库索引失效与优化详解
2019-10-26 11:52:12MySQL数据库索引失效与优化详解 案例所用的表结构、索引、与数据如下: 索引失效与优化 全值匹配 最佳左前缀法则 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描 ... -
数据库索引失效的N种情况
2019-10-28 14:44:22在B+树索引中,如果建立联合索引 index(a,b,c,d),那么能够用到索引的情况如下: 1、a=x 用到a的索引 2、a=x and b=x 用到ab的索引 3、a=x and b=x and c=x 用到abc的索引 4、a=x and b=x ... -
【学习】数据库:索引失效的几种情况
2022-02-12 15:54:04【学习】数据库:索引失效的几种情况 -
数据库索引失效-口诀
2021-11-16 11:21:42模:模糊查询%开头 型:数据类型错误 数:对索引字段使用内部函数 空:索引字段是null 运:索引列进行四则运算 最:复合索引不按索引列最左开始查找 快:全表扫描比索引更快 -
范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效
2022-01-21 14:17:28范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效; 组合索引失效; MySQL日期范围索引 -
使用数据库过程中-索引失效的几种情况
2021-09-29 13:59:311、使用like关键字模糊查询时,% 放在前面索引不起作用,只有“%”不在第一个位置,索引才会生效(like '%XX'--索引不起作用) 2、使用联合索引时,只有查询条件中使用了这些字段中的第一个字段,索引才会生效 3、... -
MySQL数据库索引优化之索引失效的几种情况(详解+代码展示)
2020-03-03 20:26:31一、索引是什么 根据官方文档所定义:索引(Index)是帮助MySQL高效获取...在计算机中,可以提高数据检索的效率,减低数据库的IO成本,降低数据排序的成本,降低CPU的消耗,也就是,排好序... -
数据库中索引失效(原因)
2018-07-22 00:13:46容易引起oracle索引失效的原因很多: 1、在索引列上使用函数。如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了。 2、新建的表还没来得及生成统计信息,分析一下就好了 3、基于cost的... -
oracle数据库中索引会失效的几种情况
2021-08-16 22:12:07创建Oracle 索引的目的是为了避免全表扫描数据,提高查询效率,但是如果sql语句写的不好致使索引失效,反而会影响数据查询效率。以下几种情况就会导致索引失效: 1. 没有 WHERE 子句 众所周知,添加索引的字段必需要...