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

SQL索引失效的场景有哪些的更多相关文章

  1. 3、MySQL 索引失效的场景

    索引失效的场景: 1.没有 where 条件 直接看 SQL 语句   2.where 条件中所在的列没有建立索引 show index from t;   3.从表中取得数据超过某个阈值.通常认为是 ...

  2. MySQL索引失效的场景

    WHERE字句的查询条件里有不等于号(WHERE column!=-),MYSQL将无法使用索引 类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=-),MYS ...

  3. 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景

    大家好,我是melo,一名大三后台练习生 专栏回顾 索引的原理&&设计原则 欢迎关注本专栏:MySQL高级篇 本篇速览 在我们上一篇文章中,讲到了索引的原理&&设计原则 ...

  4. MySQL索引失效的几种场景

    我们都知道建立索引能够提高查询效率,那么是不是任何情况下都能提高呢,当然不是的的,下面我们就来列举一些常见的索引失效的场景. 借用上一篇文章的dm_person_info表 在card_code列没加 ...

  5. MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。

    索引失效 介绍 索引失效就是我们明明在查询时的条件为索引列(包括自己新建的索引),但是索引不能起效,走的是全表扫描.explain 后可查看type=ALL. 这是为什么呢? 首先介绍有以下几种情况索 ...

  6. SQL SERVER 中is null 和 is not null 将会导致索引失效吗?

    其实本来这个问题没有什么好说的,今天优化的时候遇到一个SQL语句,因为比较有意思,所以我截取.简化了SQL语句,演示给大家看,如下所示 declare @bamboo_Code varchar(3); ...

  7. MySQL索引失效的常见场景

    当然请记住,explain是一个好习惯! MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时,MySQL的优化器有时会判定全表扫描无伤大雅,就不会命中索引了. 1. ...

  8. SQL查询:『索引失效问题』

    1.IN操作符 用IN操作符写出来的SQL直观简单.易于理解.但是在where条件中使用IN操作符是低效的.例如下面这条查询语句: SELECT * FROM tab_a WHERE id IN( S ...

  9. sql优化策略之索引失效情况二

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp63   接第一篇索引失效分析:http://grefr.iteye.co ...

  10. SQL优化 MySQL版 - 避免索引失效原则(二)

    避免索引失效原则(二) 注:继上一篇文章继续讲解: 避免索引失效原则(一)https://www.cnblogs.com/StanleyBlogs/p/10482048.html#4195062 作者 ...

随机推荐

  1. 阿里技术分享:闲鱼IM基于Flutter的移动端跨端改造实践

    本文由阿里闲鱼技术团队祈晴分享,本次有修订和改动,感谢作者的技术分享. 1.内容概述 本文总结了阿里闲鱼技术团队使用Flutter在对闲鱼IM进行移动端跨端改造过程中的技术实践等,文中对比了传统Nat ...

  2. Matlab深度学习

    View image files Instructions are in the task pane to the left. Complete and submit each task one at ...

  3. 如何禁止Chrome自动更新IDM扩展程序

    背景是使用学习版IDM下载器,版本6.41.2,地址备份:https://github.com/glucyzz/IDM 下载完成后导入chrome浏览器,但是发现挂了小猫之后浏览器立马就把此插件自动更 ...

  4. linux进入横线 "-" 开头的文件夹

    在linux进行文件操作时,会遇到一类文件是以"-"开头的. 例如我们想要进入名称为-126943579的文件时,我们无法直接使用cd -126943579命令来进入该文件. 那我 ...

  5. React基础笔记2

    一.生命周期函数 挂载卸载过程 constructor        props context componentWillMount  服务器与客户端 componentDidMount  ajax ...

  6. 【译】在分析器中使用 Meter Histogram(直方图)解锁见解

    您是否正在与应用程序中的性能瓶颈作斗争?不要再观望了!Visual Studio 2022 在其性能分析套件中引入了 Meter Histogram(直方图)功能,为您提供了前所未有的分析和可视化直方 ...

  7. Solution Set -「AGC 007~009」C~F

    目录 「AGC 007C」Pushing Balls 「AGC 007D」Shik and Game 「AGC 007E」Shik and Travel ^ 「AGC 007F」Shik and Co ...

  8. R语言系列—Rstudio简介和安装

    同学们,大家好,今天继续更新R语言系列.今天我们开始讲R语言的集成开发环境(IDE)-Rstudio,这里会对Rstudio及其安装进行介绍,感兴趣的同学可以重点关注一下. Rstudio简介 Rst ...

  9. 一款基于 .NET8 + Vue 开源、免费、跨平台的企业级在线考试系统

    前言 今天大姚给大家分享一款基于 .NET8 + Vue 开源.免费(AGPL-3.0开源协议).跨平台的企业级在线考试系统:XBLMS. 项目介绍 XBLMS是一款基于 .NET8 + Vue 开源 ...

  10. # Vue3.5常用特性整理

    Vue3.5 发布已近半年,抽空整理下常用的新增/改动特性 响应式 Props 解构 Vue3.5 中 Props 正式支持解构了,并添加了响应式跟踪 设置默认值 使用 JavaScript 原生的默 ...