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.mzph.cn/news/900011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全连接RNN反向传播梯度计算

全连接RNN反向传播梯度计算 RNN数学表达式BPTT(随时间的反向传播算法)参数关系网络图L对V的梯度L对U的梯度L对W和b的梯度 RNN数学表达式 BPTT(随时间的反向传播算法) 参数关系网络图 L对V的梯度 L对U的梯度 L对W和b的梯度

C++高效读取大规模文本格式点云(windows)

需使用VS2017及以上版本&#xff0c;C语言标准选择C17&#xff0c;支持OpenMP。 执行效率明显优于ifstream stof。 // 点云数据结构 struct PointXYZ {std::array<float, 3> coord; };float string_to_float_fast(const std::string& str) {float value;auto [p…

【Linux】进程信号的捕捉处理

个人主页~ 进程信号的捕捉处理 一、信号捕捉处理的概述1、信号捕捉处理全过程2、用户态和内核态的区别&#xff08;一&#xff09;用户态&#xff08;二&#xff09;内核态&#xff08;三&#xff09;用户态与内核态的切换&#xff08;四&#xff09;硬件条件 二、再谈进程地址…

Nyquist内置函数-概述

1 Nyquist内置函数-概述 本章提供奈奎斯特&#xff08;Nyquist&#xff09;语言参考。操作按功能和抽象级别分类。奈奎斯特在两个重要级别上实现&#xff1a;“高级”级别支持行为抽象&#xff0c;这意味着像 stretch 和 at 这样的操作可以应用。这些函数是典型用户期望使用的…

数据驱动防灾:AI 大模型在地质灾害应急决策中的关键作用。基于DeepSeek/ChatGPT的AI智能体开发

全球气候变化加剧了滑坡、泥石流等地质灾害的发生频率与不确定性&#xff0c;传统基于统计与物理模型的预测方法常受限于‌数据稀疏性‌与‌动态耦合复杂性‌。近年来&#xff0c;AI智能体&#xff08;AI Agents&#xff09;与大型语言模型&#xff08;LLMs&#xff09;的突破为…

光谱相机在工业中的应用

光谱相机&#xff08;多光谱、高光谱、超光谱成像技术&#xff09;在工业领域通过捕捉物质的光谱特征&#xff08;反射、透射、辐射等&#xff09;&#xff0c;结合化学计量学与人工智能算法&#xff0c;为工业检测、质量控制和工艺优化提供高精度、非接触式的解决方案。以下是…

Dify工作流中如何去除deepseek-r1思考内容

在工作流中deepseek-r1的think标签内部的内容&#xff0c;很容易让工作流其他的llm产生幻觉&#xff0c;导致不能良好的生成目标效果。 我们通过代码的方式让deepseek-r1既有think思考链的效果&#xff0c;又不传递思考链。 工作流的逻辑为上图 去除think中的代码为 import re…

容器的CPU

1、限制进程的CPU 通过Cgroup来限制进程资源的使用&#xff0c;CPU Cgroup 是 Cgroups 其中的一个 Cgroups 子系统&#xff0c;它是用来限制进程的 CPU 使用的。 cpu.cfs_period_us&#xff0c;它是 CFS 算法的一个调度周期&#xff0c;一般它的值是 100000&#xff0c;以 mic…

【系统分析师-第二篇】

学习目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复习过程中&#xff0c;训练快速阅读能力、掌握三遍读书法、运用番茄工作法。 2.从底层逻辑角度理解知识点&#xff0c;避免死记硬背。 3.通过考试验证学习效果。 学习方法 第二遍快速…

【再探图论】深入理解图论经典算法

一、bellman_ford 1. 是什么松弛 在《算法四》中&#xff0c;对松弛的解释是&#xff1a;relax the edge&#xff0c;看起来比较抽象&#xff0c;不过如果我们从生活中的实例去理解&#xff0c;就简单多了&#xff1a; 试想一根绳索&#xff0c;当你握着绳索的两头使劲用力拉…

基于pycharm的YOLOv11模型训练方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.1 软件环境配置1.2 训练集参考 二、训练步骤2.1 打开文件夹2.2 打开文件2.3 data.yaml最终代码 三、train.py四、最终结果五、detect.py六、 拓展…

用nodejs连接mongodb数据库对标题和内容的全文本搜索,mogogdb对文档的全文本索引的设置以及用node-rs/jieba对标题和内容的分词

//首先我们要在Nodejs中安装 我们的分词库node-rs/jieba,这个分词不像jieba安装时会踩非常多的雷&#xff0c;而且一半的机率都是安装失败&#xff0c;node-rs/jieba比jieba库要快20-30%&#xff1b;安装分词库是为了更好达到搜索的效果 这个库直接npm install node-rs/jieba即…

水下声呐探测仪,应急救援中的高效水下定位技术|深圳鼎跃

近年来&#xff0c;随着水域活动增多及自然灾害频发&#xff0c;水下救援需求日益增长。传统人工打捞方法在复杂水域中效率低、风险高&#xff0c;尤其在能见度差、水流湍急或深水区域中&#xff0c;救援难度倍增。 在此背景下&#xff0c;水下声呐探测仪凭借其声波定位与视频…

AI 网关代理 LLMs 最佳实践

作者&#xff1a;付宇轩&#xff08;计缘&#xff09; DeepSeek/QWen 普惠 AI 趋势 随着 DeepSeek-R1 的横空出世&#xff0c;又一次点燃了原本已经有点冷淡的大语言模型市场和话题&#xff0c;并且快速成为了现象级&#xff0c;小到中小学生&#xff0c;大到父母辈都知道了中…

策略模式实际用处,改吧改吧直接用,两种方式

controller RestController RequestMapping("admin/test") RequiredArgsConstructor(onConstructor __(Autowired)) public class TestController {Autowiredprivate VideoFactory VideoFactory;GetMapping("getList")public R getList(){// 第一种方式T…

chromium魔改——修改 navigator.webdriver 检测

chromium源码官网 https://source.chromium.org/chromium/chromium/src 说下修改的chromium源码思路&#xff1a; 首先在修改源码过检测之前&#xff0c;我们要知道它是怎么检测的&#xff0c;找到他通过哪个JS的API来做的检测&#xff0c;只有知道了如何检测&#xff0c;我们…

Muduo网络库实现 [九] - EventLoopThread模块

目录 设计思路 类的设计 模块的实现 私有接口 公有接口 设计思路 我们说过一个EventLoop要绑定一个线程&#xff0c;未来该EventLoop所管理的所有的连接的操作都需要在这个EventLoop绑定的线程中进行&#xff0c;所以我们该如何实现将EventLoop和线程绑定呢&#xff1f;…

UE5学习笔记 FPS游戏制作38 继承标准UI

文章目录 UE的UIUMG的继承继承标准控件创建标准控件继承标准控件的用处 UE的UI 和Untiy有onGui和UGui类似&#xff0c;UE有slateUI和UMG,slateUI是早期只能用C编写的UI&#xff0c;UMG是现在使用的&#xff0c;可以拖拽编辑的UI slateUI是UMG的父类 UMG的继承 我们编写一个控…

C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法

目录 一、什么是拓展方法&#xff1f; 二、拓展方法有啥用&#xff1f;怎么写拓展方法&#xff1f; 1. ​核心用途 2. ​编写步骤 实现步骤 关键点说明 关键规则 3. ​注意事项 三、什么是运算符重载&#xff1f; 四、运算符重载有啥用&#xff1f;怎么写&#xff1f;…

银行卡归属地查询API接口如何对接?

银行卡归属地查询 API 接口是一种能让开发者通过编程方式获取银行卡归属地等相关信息的工具。借助此接口&#xff0c;开发者可将银行卡归属地查询功能集成到自己的应用程序或系统里&#xff0c;像电商平台、第三方支付公司等都能运用它来提升业务的准确性与安全性。 银行卡归属…