灯下哥谭 灯下哥谭
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • DeepSeek Harness
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

灯下哥谭

灯还亮着
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • DeepSeek Harness
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL8-SOP

  • 课程笔记

    • MySQL实战45讲

      • MySQL45讲学习笔记
      • MySQL基础架构
      • MySQL日志系统 (Redo Log 与 Binlog)
      • MySQL事务隔离级别的实现原理
      • MySQL索引原理与优化
      • MySQL锁机制详解
      • MySQL事务与MVCC机制
      • MySQL普通索引与唯一索引的选择
      • MySQL优化器如何选择索引
        • 优化器与索引选择
          • 1. 普通索引 vs 唯一索引
          • 2. 索引下推优化(ICP)
          • 3. 优化器选择索引的逻辑
          • 4. 索引选择异常处理
      • MySQL字符串字段索引优化
      • MySQL抖动刷脏页
      • 表空间管理与回收
      • COUNT函数详解
      • 日志索引
      • orderby工作原理
      • 随机排序实现
      • SQL性能差异函数与转换
      • 慢查询分析锁与版本
      • 幻读与间隙锁
      • 加锁规则分析
      • 应急性能优化方法
      • 数据持久化保证
      • 主备一致性原理
      • 高可用架构与切换
      • 备库延迟分析与优化
      • 主备切换GTID
      • 读写分离实践与问题
      • 数据库健康检查
      • 锁与死锁
      • 数据误删恢复
      • Kill命令详解
      • 查询与内存使用分析
      • Join原理与选择
      • 临时表原理与应用
      • 内部临时表详解
      • Memory引擎详解
      • 自增ID详解
      • Insert加锁分析
      • 表复制方法比较
      • Grant与权限管理
      • 分区表详解
      • SQL语句中的Join问题
      • 自增ID用尽问题
  • 专题系列
  • 课程笔记
  • MySQL实战45讲
灯下哥谭
2024-07-27
目录

MySQL优化器如何选择索引

# MySQL 优化器如何选择索引

# 优化器与索引选择

# 1. 普通索引 vs 唯一索引

change buffer机制: change buffer示意图

当需要更新一个数据页时:

  • 如果数据页在内存中就直接更新
  • 如果数据页不在内存中,InnoDB会将这些更新操作缓存在change buffer中
  • 下次查询需要访问该数据页时,将数据页读入内存并执行change buffer中的操作

唯一索引必须将数据页读入内存判断唯一性,因此无法使用change buffer;普通索引可以利用change buffer提升更新性能。

使用场景:

  • 适合:写多读少的业务(如账单、日志)
  • 不适合:写入后立即读取的场景

建议: 业务不强制要求唯一性时,优先选择普通索引。

# 2. 索引下推优化(ICP)

ICP示意图

原理:

  • 在索引遍历过程中,对索引中包含的字段先做判断
  • 直接过滤掉不满足条件的记录,减少回表次数

效果:

  • 减少回表操作
  • 提高查询效率

查看: EXPLAIN的Extra列显示Using index condition表示使用了ICP

# 3. 优化器选择索引的逻辑

优化器基于成本选择索引,主要考虑:

  • I/O成本:从磁盘读取数据页的成本
  • CPU成本:数据解析和判断的成本

常见索引选择异常情况:

  • 统计信息不准确
  • 成本估算偏差
  • 索引选择受查询条件顺序影响

# 4. 索引选择异常处理

解决方法:

  1. 使用force index强制指定索引
  2. 修改SQL语句引导优化器选择
  3. 重建索引或analyze table更新统计信息
  4. 增加或优化索引

案例: 索引选择示例

#学习笔记#MySQL
上次更新: 9/11/2026

← MySQL普通索引与唯一索引的选择 MySQL字符串字段索引优化→

最近更新
01
DeepSeek Harness 实战 06|学习笔记:插件、工具、技能不在同一个维度上 原创
09-11
02
DeepSeek Harness 实战 05|让两个编码 Agent 共用一份长期记忆 原创
09-09
03
DeepSeek Harness 实战 04|学习笔记:从「已知限制」里读出三处设计张力 原创
09-08
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式