码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MySQL索引失效的情况


    索引失效的情况

    • 一、索引的本质
    • 二、索引失效
      • 1、索引为什么会失效?
      • 2、索引失效的场景有哪些?
        • A.不遵循排序规则
        • B.不遵循定位数据用 '=' / 'and'
        • C.隐式放弃使用字段
        • D.优化器的成本评估
        • E.order by 情况
    • 参考文献

    一、索引的本质

    索引是一种可以快速寻找指定数据的数据结构,为了能使其快速定位数据,则存储的方式有一定的要求。如,

    1. 有序数组,可以通过二分快速定位数据,且查找范围数据也方便;

    2. 字典树,可以寻找指定字符串;

    3. 哈希表,可以达到O(1)的寻找速度,但是范围查找却不是很方便;

    4. 跳表,弥补在链表上无法使用二分的问题;

    5. 二叉平衡搜索树,快速寻找数据,但是深度可能会很深,如果用于磁盘存储,寻找数据时,就会存在大量的磁盘块定位,耗时。除此之外,维护其结构也比较麻烦;

    6. 红黑树,弱平衡二叉树,虽然有着同样的问题,虽然维护起来简单一点,但是深度还是太深;

    7. 多路平衡搜索树–B树,既然是搜索树,那么定位数据就在O(logN)级别,而且深度不深,但是范围查询很麻烦;

    8. B+树,不同于B树,其数据全在叶子节点,所有叶子节点通过指针串联起来,这样不仅定位单个数据快,范围查询也变得很快。

    总:MySQL的InnoDB和MyISAM存储引擎的索引就是采用B+树来存储数据的。

    二、索引失效

    1、索引为什么会失效?

    索引失效即寻找数据时没用到索引字段。所以索引为什么会失效就转变成什么情况下就用不到索引了?这就得从B+树索引的本质出发。

    1-B+树索引本质是什么?
    将索引包含的字段按字典序进行排序!排序规则显而易见,小的在前,部分相同时,则看后面的部分谁小。

    所以索引失效的第一种本质:不遵循排序规则(先左后右)去定位数据。常见的有左前缀匹配原则,如like ‘%’/复合索引字段左匹配。

    第二:即使遵循了排序规则,但不遵循定位数据用 ‘=’ / ‘>/<’ / ‘and’,那么也无法用索引。如 != / <> / or / not in / not exists

    第三:即使遵循了排序规则,也遵循了定位数据非不等于,如果没直接用到该索引字段,那也算索引失效。如对字段四则运算/套壳类(内置函数处理了/隐式转换了(字符串与整形的互转)),这些都属于没有用该字段,自然用不到索引。

    第四:如果走索引的成本会高于全表扫描,则优化器不会选择走索引。

    2、索引失效的场景有哪些?

    根据上面对索引失效四种本质性的探讨,索引失效的场景就很容易想到了。

    A.不遵循排序规则

    1. 联合索引不走左前缀匹配;

    2. like匹配不走左前缀匹配,其实字符串也可以看成多个字符的复合索引,一个道理;

    3. 两列字段进行比较。

    B.不遵循定位数据用 ‘=’ / ‘and’

    1. != / <> / not in / not exists / is not null 一类;

    C.隐式放弃使用字段

    1. 四则运算导致字段被包装;

    2. 内置函数导致字段被包装;

    3. 类型的隐式转换,和内置函数/四则运算同理,相当于对字符串/整形进行了处理。

    D.优化器的成本评估

    1. 网上的select * from讲的是不会走索引(对于要回表的普通索引),其实不然。当数据量很大且范围查询时,回表+走索引的成本可能会超过全部扫描,当优化器评估为 超过,则不走索引,反之走索引。

    2. or 连接了一些没有索引的字段,其实不是索引失效,是不如全表扫描的花销低;

    E.order by 情况

    1. order by 非索引字段;

    2. order by索引字段,但不按索引字段的先后来排序;

    3. 即使按了索引字段的前后关系排序,但升序降序不一致。

    4. 即使前后排序 + 同升同降,不加where/limit,还不如全表扫描。

    参考文献

    [1] 索引失效的10种场景

    [2] select * 真的不走索引吗?

    [3] 索引失效的15种场景

  • 相关阅读:
    浅谈双指针技巧(二)---通过双指针判断链表成环问题
    Kotlin注解
    【Mysql系列】mysql中删除数据的几种方法
    【Dubbo3高级特性】「框架与服务」服务端通过线程池隔离技术实现资源限制和资源隔离机制
    SQL Server报错:数据库"YourDatabaseName"的事务日志已满,原因为"LOG_BACKUP"
    C# 读写TXT文件
    mavlink 避坑指南
    [.NET项目实战] Elsa开源工作流组件应用(三):实战演练
    【网络容灾失败案例】三种HTTP请求重试导致重复提交
    UML 的工厂方法设计模式 策略设计模式 抽象工厂设计模式 观察者设计模式
  • 原文地址:https://blog.csdn.net/qq_43164662/article/details/126571124
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号