当前位置: 首页 > news >正文

MySQL索引原理:从B+树手绘到EXPLAIN

最近在学后端,学到了这里做个记录


一、为什么索引像书的目录?

  • 类比:500页的技术书籍 vs 10页的目录
  • 缺点:全表扫描就像逐页翻找内容
  • 优点:索引将查询速度从O(n)提升到O(log n)

二、B+树手绘课堂

1. 结构解剖(建议手绘图包含以下元素)

          +------------+
          |  非叶子节点 |
          | [10, 20, 30] | ← 键值+指针
          +-----|--|-----+
            ____/  \____
           /            \
+-----------+    +-----------+
| 叶子节点   |    | 叶子节点   |
| [5,8,10] → | ←→ | [20,25,30] | ← 双向链表
| 行数据指针 |    | 行数据指针 |
+-----------+    +-----------+
  • 用不同颜色标注:
    • 红色:节点分裂临界点(每个节点最多存3个键值)
    • 蓝色:叶子节点的双向指针
    • 绿色:行数据实际存储位置

2. 动态过程

  • 插入过程:
    插入28 → 定位到[20,25,30]节点 → 分裂为[20,25]和[28,30]
    新增父节点指针
    
  • 查询路径:
    查找25 → 根节点→中间节点→叶子节点(3次磁盘IO)
    

三、InnoDB索引落地实现

1. 聚簇索引结构

[表空间文件示意图]
+----------------------+
| 页1: 索引节点        |
| 页2: 叶子节点(行记录)|
| 页3: 溢出页(TEXT字段)|
+----------------------+

2. 二级索引特殊机制

-- 创建示例
CREATE TABLE users (
  id INT PRIMARY KEY,
  username VARCHAR(20),
  INDEX idx_name (username)  -- 存储(username,id)
);

-- 回表示例
EXPLAIN SELECT * FROM users WHERE username='Alice';

四、EXPLAIN执行计划实战

1. 关键字段解读表

列名索引健康度指标优化提示
typeALL(全表) → range(范围) → const(常量)争取至少达到range级别
key_len使用的索引字节数utf8mb4字段需×4计算
ExtraUsing index(覆盖索引)出现Using filesort立即警报

2. 典型案例分析

-- 案例1:最左前缀原则
EXPLAIN SELECT * FROM orders 
WHERE status='paid' AND create_time > '2023-01-01';
-- 可能的索引方案:
-- 方案A: INDEX(status, create_time) → type: range
-- 方案B: INDEX(create_time, status) → type: ref

-- 案例2:索引合并
EXPLAIN SELECT * FROM products 
WHERE category=1 OR price < 100;
-- 出现Using union(idx_category,idx_price)说明触发了索引合并

五、性能优化-checklist

  1. 设计阶段

    • 整型主键比UUID减少30%存储空间
    • 联合索引字段顺序遵循ARC原则:
      A(等值条件) → R(范围条件) → C(排序字段)
  2. 调优阶段

    -- 查看索引使用情况
    SELECT * FROM sys.schema_unused_indexes;
    
    -- 强制索引测试
    SELECT * FROM table1 FORCE INDEX(idx_col1) WHERE...
    
  3. 紧急处理

    # 快速定位索引问题
    pt-index-usage /var/lib/mysql/mysql-slow.log
    

六、学习资源

  • 推荐工具:
    B+ Tree可视化工具
http://www.dtcms.com/a/112687.html

相关文章:

  • 合肥京东运营服务商TOP5推荐
  • Axure数据可视化科技感大屏设计资料——赋能多领域,展示无限价值
  • C# 类库生成后自动复制到指定目录
  • Mysql 集群架构 vs 主从复制架构
  • PostgreSQL LIKE 操作符详解
  • 如何在windows 环境、且没有显卡的情况下用python跑通从ModelScope下载的大模型的调用
  • FPGA状态机思想实现流水灯及HDLBits学习
  • 02.unity各个面板说明
  • JSON Crack:简化数据可视化的参数编辑器
  • 【Guava】新集合 - BiMapMultimapMultiset
  • JavaScript中左键单击(click)与双击(dblclick)事件的关系解析地图操作避坑
  • vue项目data functions should return an object
  • Linux的 `/proc` 目录 笔记250404
  • 【kubernetes】BusyBox
  • 试用thymeleaf引入vue-element-admin(一)
  • 工业领域网络安全技术发展路径洞察报告发布 | FreeBuf咨询
  • HTTP Content-Type
  • 【CSP】202403-1词频统计
  • Haskell语言的云安全
  • Linux文件处理三剑客详解-grep,sed,awk
  • 如何使用 Puppeteer 解决 reCAPTCHA 并提高成功率
  • TDengine 快速上手:安装部署与基础 SQL 实践(一)
  • TypeScript语言的操作系统原理
  • FPGA实验记录
  • VSCode远程连接
  • WebSocket 详解:构建一个复杂的实时聊天应用
  • acme.sh管理 SSL/TLS 证书
  • 使用PyTorch训练VGG11模型:Fashion-MNIST图像分类实战
  • 0302useState-hooks-react-仿低代码平台项目
  • AingDesk是一款简单好用的AI助手,支持知识库、模型 API、分享、联网搜索、智能体,它正在迅速发展和改进