面试官:索引失效场景有哪些?

简介: 以下是内容的摘要:本文列举了可能导致数据库索引失效的16种情况:全表扫描、索引列使用计算或函数、LIKE查询条件不匹配、未遵循联合索引最左前缀原则、索引列参与排序无筛选、隐式类型转换、OR条件连接索引、IN子句大量值、NOT操作、数据分布不均的JOIN、数据过于分散的查询、大结果集、临时表或派生表操作、索引维护不及时以及不等于比较和IS NOT NULL条件。这些情况都可能使查询优化器放弃使用索引,影响查询性能。

1、全表扫描操作:

SELECT COUNT(*) FROM table;

统计表中所有行的数量时,即使表有索引,也可能触发全表扫描,因为索引不能直接提供行计数。

TRUNCATE TABLE;、DROP TABLE; 或 ALTER TABLE...; 等DDL操作通常不涉及索引。

2、索引列使用计算或函数:

SELECT * FROM table WHERE indexed_column / 2 = value;

对索引列进行数学运算(如除法、乘法等)或应用函数(如TO_CHAR(), UPPER(), LOWER()等),可能导致索引失效,因为索引存储的是原始数据值,而非经过计算或函数处理后的值。

3、LIKE查询条件不匹配索引:

SELECT * FROM table WHERE indexed_column LIKE 'abc%';

以通配符开头的查询(如'%abc')通常无法利用索引。但以固定字符串开头的模糊查询(如'abc%')有时可以利用索引前缀。

4、联合索引未按最左前缀原则使用:

CREATE INDEX idx ON table(a, b, c);

对于一个多列索引,查询仅使用索引的一部分(如只查询b和c列),或者查询顺序与索引列顺序不一致(如先查询c再查询a),可能导致索引失效。

5、索引列参与排序但无谓值筛选:

SELECT * FROM table ORDER BY indexed_column;

当仅对索引列进行排序而无其他筛选条件时,可能无法利用索引进行排序优化。

6、索引列被隐式转换:

SELECT * FROM table WHERE indexed_column = 'value' AND indexed_column IS NOT NULL;

如果查询中对索引列进行了隐式类型转换(如将数值型索引列与字符串比较),可能导致索引失效。

7、索引列使用OR连接多个条件:

SELECT * FROM table WHERE indexed_column = value1 OR indexed_column = value2;

除非索引支持IN列表查询,否则使用OR连接多个索引列条件可能导致索引失效。

8、索引列在IN子句中包含大量值:

SELECT * FROM table WHERE indexed_column IN (value1, value2, ..., valueN);

当IN子句包含过多值时,查询优化器可能判断使用索引不如全表扫描划算,从而放弃使用索引。

9、索引列用于NOT操作:

SELECT * FROM table WHERE NOT indexed_column = value;

对索引列应用逻辑非操作(如NOT、!=、<>)可能导致索引失效,除非索引支持倒序扫描。

10、索引列用于JOIN条件但数据分布不均:

SELECT * FROM table1 JOIN table2 ON indexed_column = foreign_key;

如果关联表的数据分布极不均匀,即使使用了索引,也可能因数据倾斜导致索引效果不佳。

11、索引列数据过于分散:

SELECT * FROM table WHERE indexed_column BETWEEN low_value AND high_value;

如果查询条件覆盖了索引列的大部分值(如查询范围过大),可能导致索引效果减弱或失效。

12、查询结果集过大:

SELECT * FROM table WHERE indexed_column = value;

当查询结果集预计远大于工作集(如全表的一定比例)时,查询优化器可能认为全表扫描更高效,从而不使用索引。

13、临时表或派生表操作:

CREATE TEMPORARY TABLE AS SELECT ...;

创建临时表或派生表的操作通常不保留原表的索引,后续查询可能无法利用索引。

14、索引未被维护或统计信息过期:

ANALYZE TABLE table;

如果表数据发生显著变化后未重新收集统计信息,或索引长期未进行维护,可能导致查询优化器对索引效用的评估不准确,从而不使用索引。

15、不等于比较

select * from t_user where id_no <> '1002';

查询条件使用不等进行比较时,需要慎重,普通索引会查询结果集占比较大时索引会失效

16、is not null

select * from t_user where id_no is not null;

查询条件使用is null时正常走索引,使用is not null时,不走索引。

目录
相关文章
|
5月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
3月前
|
SQL 缓存 Java
MyBatis场景面试题
MyBatis与MyBatisPlus均属ORM框架,前者擅长复杂SQL及动态查询,后者封装API简化单表操作。常用XML标签如if、foreach提升SQL灵活性。MyBatis支持一级(SqlSession级)与二级(NameSpace级)缓存,提升查询效率。#{}防SQL注入,${}用于动态表名等场景。
221 62
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
JavaScript
【Vue面试题十四】、说说你对vue的mixin的理解,有什么应用场景?
这篇文章详细介绍了Vue中`mixin`的概念、应用场景和源码分析,解释了`mixin`如何用于代码复用、功能模块化,并通过实际代码示例展示了在Vue组件中局部混入和全局混入的使用方式。
【Vue面试题十四】、说说你对vue的mixin的理解,有什么应用场景?
|
7月前
|
算法
面试场景题:如何设计一个抢红包随机算法
本文详细解析了抢红包随机算法的设计与实现,涵盖三种解法:随机分配法、二倍均值法和线段切割法。随机分配法通过逐次随机分配金额确保总额不变,但易导致两极分化;二倍均值法优化了金额分布,使每次抢到的金额更均衡;线段切割法则将总金额视为线段,通过随机切割点生成子金额,手气最佳金额可能更高。代码示例清晰,结果对比直观,为面试中类似算法题提供了全面思路。
1313 16
|
并行计算 数据挖掘 大数据
[go 面试] 并行与并发的区别及应用场景解析
[go 面试] 并行与并发的区别及应用场景解析
|
9月前
|
消息中间件 存储 Java
招行面试:10Wqps场景,RocketMQ 顺序消费 的性能 如何提升 ?
45岁资深架构师尼恩在其读者群中分享了关于如何提升RocketMQ顺序消费性能的高并发面试题解析。面对10W QPS的高并发场景,尼恩详细讲解了RocketMQ的调优策略,包括专用方案如增加ConsumeQueue数量、优化Topic设计等,以及通用方案如硬件配置(CPU、内存、磁盘、网络)、操作系统调优、Broker配置调整、客户端配置优化、JVM调优和监控与日志分析等方面。通过系统化的梳理,帮助读者在面试中充分展示技术实力,获得面试官的认可。相关真题及答案将收录于《尼恩Java面试宝典PDF》V175版本中,助力求职者提高架构、设计和开发水平。
招行面试:10Wqps场景,RocketMQ 顺序消费 的性能 如何提升 ?
|
11月前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
10月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
存储 关系型数据库 MySQL
贝壳面试:什么是回表?什么是索引下推?
在40岁老架构师尼恩的读者交流群中,近期有成员获得了得物、阿里、滴滴等一线互联网企业的面试机会,遇到了诸如“MySQL索引下推”、“回表查询”等重要面试题。由于缺乏准备,部分成员未能通过面试。为此,尼恩系统地整理了相关知识点,帮助大家提升技术实力,顺利通过面试。具体内容包括MySQL的架构、回表查询的工作原理及其性能问题、索引下推的底层原理和优势等。此外,尼恩还提供了优化建议和实战案例,帮助大家更好地理解和应用这些技术。尼恩的技术资料《尼恩Java面试宝典PDF》也收录了这些内容,供后续参考。
贝壳面试:什么是回表?什么是索引下推?