Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
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抖动刷脏页
    • 表空间管理与回收
    • count函数详解
    • 日志索引
    • orderby工作原理
    • 随机排序实现
    • SQL性能差异函数与转换
    • 慢查询分析锁与版本
    • 幻读与间隙锁
    • 加锁规则分析
    • 应急性能优化方法
    • 数据持久化保证
    • 主备一致性原理
    • 高可用架构与切换
    • 备库延迟分析与优化
    • 主备切换GTID
    • 读写分离实践与问题
    • 数据库健康检查
    • 锁与死锁
    • 数据误删恢复
    • Kill命令详解
    • 查询与内存使用分析
    • Join原理与选择
    • 临时表原理与应用
    • 内部临时表详解
    • Memory引擎详解
    • 自增ID详解
    • Insert加锁分析
    • 表复制方法比较
    • Grant与权限管理
    • 分区表详解
    • SQL语句中的Join问题
    • 自增ID用尽问题
  • 专题系列
  • MySQL实战45讲学习笔记
Carry の Blog
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#优化器#索引选择#成本估算#统计信息#Cardinality#Force Index#学习笔记
上次更新: 6/21/2025

← MySQL普通索引与唯一索引的选择 MySQL抖动刷脏页→

最近更新
01
表空间管理与回收
06-21
02
MySQL抖动刷脏页
06-21
03
count函数详解
06-21
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式