SQL索引失效的场景有哪些

news/2025/3/22 12:06:47/文章来源:https://www.cnblogs.com/huajieyu/p/18786394

SQL优化里面主要是围绕索引来展开的,SQL优化的一大重点就是避免索引失效,因为索引失效就会导致全表扫描,数据量很大的情况下能明显感受到查询速度的降低。

下面说说索引失效的各种场景。


  1. 使用索引的时候,进行了类型的隐式转换。举个例子,比如person_no是varchar类型的12345,这时候查询应该是【select * from table where person_no='12345';】,这时候索引就是有效的,但是如果误把查询写成【select * from table where person_no=12345;】,也是能查出数据,但是会进行类型转换再进行匹配,这时候就会导致索引失效。其他类型的隐式转换(如 DATE 和字符串的转换)也可能导致失效,不同字符集的隐式转换(如 utf8mb4 和 latin1)也可能失效,查询的时候确保条件值与字段类型一致。

  1. where条件里用到or,如果两边字段都有索引,可能会触发索引合并(Index Merge);若一边无索引,则全表扫描。这里可以考虑为or条件中的字段添加索引,或用union替代or。

  1. 不符合最左前缀法则,如果建立了联合索引(A,B,C),在where条件中只使用了B和C条件,就会导致这个联合索引失效,所以一定要包含A。如果包含A和C的情况下,C的索引也是失效的,因为B不在条件中,所以如果想要C也生效就得加上B的相关条件。

  1. 用到is not null语法。当对某个字段创建索引的时候,该字段上大多字段都是有值的才有这个需求,此时如果字段允许 NULL 且存在索引,如果用is null查询为null的数据索引可能有效,但是用is not null查询非null的记录时,如果大部分数据非 NULL,优化器可能选择全表扫描,导致索引失效。

  1. 用到not in语法或者!=,查询不在某一集合以外的元素,会导致全表扫描。使用 left join 或 not exists 优化 not in。

  1. 用到>或者<或者between and语法,范围查询对当前列索引有效,但联合索引中后续列无法使用索引。例如【select * from table where a > 100 and b = 200; a 走索引,b 无法走索引】,建议优化为将等值条件列放在联合索引左侧。

  1. 使用模糊查询like可能会导致索引失效,此时用'%xxx'匹配就必然会导致索引失效,如果用‘xxx%’这时候索引可能就还有用,简单来说就是模糊查询尽量不要匹配后缀,而是匹配前缀。如果使用全文索引(如 MySQL 的 FULLTEXT),可优化模糊查询。

  1. 对在条件中对索引列进行运算操作,也会导致索引失效。例如对person_no建立了单列索引,需要查询person_no的前三位是'123'的数据,查询语句为【select id,person_no from table where substring(person_no, 1, 3)='123'】,这时候进行了substring操作,导致了索引失效,所以查询的时候避免对索引列运算。

  1. 数据分步过于集中,例如性别字段,只有男和女两种可能,索引也不建议建立在这样的字段上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/903429.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20244224 实验一《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名: 旦曾央京 学号:20244224 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等; 4.编…

【智慧构造题】CF1427E Xum

我们发现这个原数为奇数的条件比较神秘,于是我们考虑每次把这个数字第一位 \(1\) 给干了。 考虑怎么构造。 令 $d=\lfloor \log_2 x \rfloor $ 令 \(x=1abc1\) \(x1=1abc10000\) \(x2=1abc0abc1\) \(x3=x2+x1=1abc01abc1\) \(x4=x ⊕ x3=1abc000000\) \(x5=x1+x1=1abc100000…

DataGrip结果运行在代码区域

DataGrip运行过后发现运行的结果在代码区域解决方式进入设置界面 点击左上角File(文件)->settings(设置) 搜索栏输入results或output and results 找到下面的设置界面 找到Results下的 Show results in editor ,取消勾选

我们接着创建项目中的app

在pycharm中运行以下代码python manage.py startapp teslaapp运行后呢会在目录中在创建一个名字叫teslaapp的包接着我们还需要在项目Tesla包中的setting文件中 添加我们刚创建的app名称

CMU_15445_Project4_BonusTask_Serializable_Verification

Serializable Verification 我们知道 MVCC 并不能解决幻读以及写偏差的问题, 仅通过 MVCC 的事务调度是无法保证数据库引擎的 ACID 原则的, 那么为了保证数据库的 ACID 原则, 即使在调度的过程中无法保证, 可以通过在 Commit 的时候, 通过验证, Abort 可能造成写偏差于幻读的事…

使用低代码平台设计UI

由于自己不是专业的设计师,就自己简单画个UI界面,那么就可以用到下面的低代码平台 http://120.92.142.115:81/vform3/ 里面可以选择体验vue3模板 进入下面图中的设计界面可以自己拖动组件 修改组件展示给用户的标签名称 以及数据传输时发送的字段名称 可以设置是否必填 默认值…

使用 Hosting 构建 WPF 程序 - prism 篇

WPF + .NET Generic Host + Prism + CommunityToolkit.Mvvm在 使用 Hosting 构建 WPF 程序 - Stylet 篇 中,使用 Hosting + Stylet 的方式,构建了一个 WPF 框架, 本文用于记录使用 .NET Generic Host + Prism 构建 WPF 所需的修改,仅供参考。 示例代码:Jasongrass/Demo.Ap…

如何构建一个用于3D扫描的电动转台

在这个项目中,我将向您展示如何构建一个用于3D扫描的电动转台。这个DIY项目由三个主要部分组成:顶板、中央齿轮驱动板和底座。顶板保持静止,作为放置待扫描物体的平台。在设计的核心,中间板的特点是一个内部齿轮机构,隐藏在视线之外,这是由一个步进电机驱动。这个齿轮板旋…

【每日一题】20250322

【每日一题】 1.(18分) \(\hspace{0.7cm}\)I.(5分)根据单摆周期公式 \(\displaystyle T=2\pi\sqrt{\frac{l}{g}}\),可以通过实验测量当地的重力加速度.如图 \(1\) 所示,将细线的上端固定在铁架台上,下端系一小钢球,就做成了单摆.\(\hspace{0.7cm}\)(1)用游标卡尺测…

Git 和 GitHub 笔记

笔记说明 该笔记记录所有我使用 Git 和 GitHub 过程中遇到的、觉得需要记录的事情。复杂的问题按需抽出来单独称为一篇笔记,换成博客链接。 修改远程仓库名字后,本地仓库做什么处理? git remote -v git remote set-url origin https://github.com/用户名/新仓库名.git or gi…

外设驱动库开发笔记55:MAX31865热电阻变送器驱动

外设驱动库开发笔记55:MAX31865热电阻变送器驱动热敏电阻(RTD)作为一种高精度的温度传感器,在工业控制、医疗设备和实验室测量等领域有着广泛的应用。MAX31865是Maxim Integrated推出的一款专为RTD设计的信号调理器,能够简化RTD的温度测量过程。本文将详细介绍如何设计一个…

【20250322】热烈庆祝《青猪》系列第二季定档7月

www七年终于等来了 初中的时候还经常在班上跟同学聊这番好耶!考个好成绩,暑假一边学CSAPP一边看!