我们来学mysql -- 用函数,破坏“索引”有序性

如何破坏索引

题记

  • 为了提高检索效率,说明了原理,建立了索引
  • 在此基础上,大部分场景在索引的助力之下
  • 有如神兵相助,丝滑的很呦!!!
  • 但是呢!就是有些情况,天王老子来了也不好使
  • 那就是索引失效
  • 我是估摸着,各种说法听的耳朵都磨出茧子了
  • 有个蛋用,不会的还是不会...
  • 那么换个角度,想办法破坏索引
  • 就是不能很好利用索引

"破坏"索引有序性

  • 索引树每层是有序的

  • 所以基于给定值检索,可以使用二分法,效率杠杠的

    sql 复制代码
    SELECT * FROM orders WHERE create_time = '2024-12-06 10:00:00'
    • 在根节点,比较'2024-12-06 10:00:00'与节点内的键值范围,直接确定下一个需要访问的子节点页
    • 在中间层节点重复此过程
    • 最终在叶子节点定位到精确匹配的索引条目(或确定其不存在)
    • 整个过程中,优化器无需访问'2024-12-06 08:00:00'或'2024-12-07 00:00:00'等无关的索引条目
  • 但,现在的目标,是让这个二分法失效

  • 来,欢迎增本降效 利器,有请函数

  • 在索引条件 字段上使用函数

    sql 复制代码
    SELECT * FROM orders WHERE DATE(create_time) = '2024-12-06'
  • 索引存的是create_time字段的原始值

  • 现在使用上了函数,即:在索引树上扫描,得先取到值,再进行计算,再做比较

    • 对于DATE(create_time) = '2024-12-06'
    • 索引中存储的是'2024-12-05 23:59:59', '2024-12-06 00:00:01', '2024-12-06 12:00:00', '2024-12-07 01:00:00'
    • 优化器无法在树的中间节点通过比较'2024-12-06'(目标值)和'2024-12-06 00:00:01'(索引键值)来做出导航决策
    • 因为它不知道DATE('2024-12-06 00:00:01')的结果是什么,必须实际计算后才能知晓
  • 这样,成功实现了从**"树搜索"降级为"顺序扫描"**

  • 退化为了必须从索引的第一个叶子节点开始,沿着链表顺序扫描所有索引条目,取值,使用函数计算

尾巴

  • 实际上,已有的索引并没有被破坏
  • 索引树每层的值还是有序排列
  • 只是加上了函数,没办法使用有序性 支持下的二分法
相关推荐
百万蹄蹄向前冲6 小时前
密码都对Node.js却连不上Linux数据库
linux·mysql
华章酱6 小时前
MySQL幻读是怎么出现的
数据库·mysql·幻读
浅念-6 小时前
Redis基础详解:单线程模型、String与Hash数据结构
服务器·数据库·redis·sql·mysql·nosql数据库·nosql
aramae7 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
这个DBA有点耶8 小时前
InnoDB索引组织表下,复合主键和自增主键的物理存储差异与选型对比
数据库·mysql·架构
李少兄8 小时前
数据库批量清理前置防御:如何严谨校验目标表是否存在
mysql
香吧香8 小时前
Docker Swarm 线上环境 MariaDB XA 悬停事务故障排查
mysql·异常
小白男神9 小时前
MySQL进阶学习三(视图)
后端·mysql
文人sec12 小时前
grant 之后要跟着 flush privileges 吗?要不要使用分区表?
数据库·mysql·adb·数据分析
高级程序源12 小时前
django招聘网站信息爬取与分析系统79704-计算机课程设计、毕业设计
后端·python·mysql·小程序·django·flask·课程设计