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

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可视化工具

相关文章:

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

最近在学后端&#xff0c;学到了这里做个记录 一、为什么索引像书的目录&#xff1f; 类比&#xff1a;500页的技术书籍 vs 10页的目录缺点&#xff1a;全表扫描就像逐页翻找内容优点&#xff1a;索引将查询速度从O(n)提升到O(log n) 二、B树手绘课堂 1. 结构解剖&#xff0…...

SQLark:一款国产免费数据库开发和管理工具

SQLark&#xff08;百灵连接&#xff09;是一款面向信创应用开发者的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统&#xff0c;目前可以支持达梦数据库、Oracle 以及 MySQL。 对象管理 SQLark 支持丰富的数据库对象管理功能&#xff0c;包括…...

防爆对讲机VS非防爆对讲机,如何选择?

在通信设备的广阔市场中&#xff0c;对讲机以其高效、便捷的特点&#xff0c;成为众多行业不可或缺的沟通工具。而面对防爆对讲机与非防爆对讲机&#xff0c;许多用户常常陷入选择困境。究竟该如何抉择&#xff0c;且听我为您细细道来。 防爆对讲机&#xff0c;专为危险作业场…...

微信小程序开发:开发实践

微信小程序开发实践研究 摘要 随着移动互联网的迅猛发展&#xff0c;微信小程序作为一种轻量化、无需安装的应用形式&#xff0c;逐渐成为开发者和用户的首选。本文以“个人名片”小程序为例&#xff0c;详细阐述了微信小程序的开发流程&#xff0c;包括需求分析、项目规划、…...

操作 Office Excel 文档类库Excelize

Excelize 是 Go 语言编写的一个用来操作 Office Excel 文档类库&#xff0c;基于 ECMA-376 OOXML 技术标准。可以使用它来读取、写入 XLSX 文件&#xff0c;相比较其他的开源类库&#xff0c;Excelize 支持操作带有数据透视表、切片器、图表与图片的 Excel 并支持向 Excel 中插…...

青铜与信隼的史诗——TCP与UDP的千年博弈

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 第一章 契约之匣与自由之羽 熔岩尚未冷却的铸造台上&#xff0c;初代信使长欧诺弥亚将液态秘银倒入双生模具。左侧模具刻着交握的青铜手掌&#xff0c;右侧则是展开的隼翼纹章。当星辰…...

「青牛科技」GC5849 12V三相无感正弦波电机驱动芯片

芯片描述&#xff1a; • 4 &#xff5e; 20V 工作电压&#xff0c; 30V 最大耐压 • 驱动峰值电流 2.0A &#xff0c;连续电流 800mA 以内 • 芯片内阻&#xff1a; 900mΩ &#xff08;上桥 下桥&#xff09; • eSOP-8 封装&#xff0c;底部 ePAD 散热&#xff0c;引…...

Java基础之反射的基本使用

简介 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。反射让Java成为了一门动…...

大语言模型中的嵌入模型

本教程将拆解什么是嵌入模型、为什么它们在NLP中如此重要,并提供一个简单的Python实战示例。 分词器将原始文本转换为token和ID,而嵌入模型则将这些ID映射为密集向量表示。二者合力为LLMs的语义理解提供动力。图片来源:[https://tzamtzis.gr/2024/coding/tokenization-by-an…...

【从零实现Json-Rpc框架】- 项目实现 - 服务端主题实现及整体封装

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

位置编码(Positional Encoding, PE)的作用

在神经网络&#xff08;尤其是Transformer、RNN等序列模型&#xff09;中&#xff0c;位置编码&#xff08;Positional Encoding, PE&#xff09;的作用是为模型提供序列中元素的位置信息&#xff0c;以弥补模型本身对顺序感知的不足。 为什么Transformer需要位置编码&#xf…...

开源的 LLM 应用开发平台Dify的安装和使用

文章目录 前提环境应用安装deocker desktop镜像源配置Dify简介Dify本地docker安装Dify安装ollama插件Dify安装硅基流动插件简单应用练习进阶应用练习数据库图像检索与展示助手echart助手可视化 前提环境 Windows环境 docker desktop魔法环境&#xff1a;访问Dify项目ollama电脑…...

从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.1.2行业落地挑战:算力成本与数据隐私解决方案

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第五部分:行业应用与前沿探索5.1.2 行业落地挑战:算力成本与数据隐私解决方案1. 算力成本挑战与优化策略1.1 算力成本的核心问题1.2 算力优化技术方案2. 数据隐私挑战…...

NodeJS--NPM介绍使用

1、使用npm install命令安装模块 1.1、本地安装 npm install express 1.2、全局安装 npm install express -g 1.3、本地安装和全局安装的区别...

DeepSeek与ChatGPT的优势对比:选择合适的工具来提升工作效率

选DeepSeek还是ChatGPT&#xff1f;这就像问火锅和披萨哪个香&#xff01; "到底该用DeepSeek还是ChatGPT?” 这个问题最近在互联网圈吵翻天!其实这就跟选手机系统-样&#xff0c;安卓党iOS党都能说出一万条理由&#xff0c;但真正重要的是你拿它来干啥&#xff01;&am…...

lib-zo,C语言另一个协程库,sleep协程化,睡眠

lib-zo,C语言另一个协程库,sleep协程化,睡眠 另一个 C 协程库 https://blog.csdn.net/eli960/article/details/146802313 重载了 sleep 函数, 使其支持协程化 另外毫秒单位睡眠函数 void zcoroutine_sleep_millisecond(int milliseconds);例子 #include "coroutine.h…...

25大唐杯赛道一本科B组知识点大纲(下)

5G/6G网络技术知识点&#xff08;10%&#xff09; 工程概论及通信工程项目实践&#xff08;20%&#xff09; 5G垂直行业应用知识点&#xff08;20%&#xff09; ⭐⭐⭐为重点知识&#xff0c;尽量要过一遍哦 大唐杯赛道一国一备赛思路 大唐杯国一省赛回忆录--有付出就会有收…...

Python+Playwright自动化测试-1-环境准备与搭建

1、Playwright 是什么&#xff1f; 微软在 2020 年初开源的新一代自动化测试工具&#xff0c;它的功能类似于 Selenium、Pyppeteer 等&#xff0c;都可以驱动浏览器进行各种自动化操作。它的功能也非常强大&#xff0c;对市面上的主流浏览器都提供了支持&#xff0c;API 功能简…...

生产管理系统如何破解汽车零部件行业追溯难痛点

在汽车零部件制造行业中&#xff0c;生产追溯一直是企业面临的核心挑战之一。随着市场竞争的加剧和客户需求的日益复杂&#xff0c;如何确保产品质量、快速定位问题源头、减少批次性返工&#xff0c;成为了每个企业亟待解决的问题。而生产管理系统&#xff0c;作为智能制造的重…...

【XTerminal】【树莓派】Linux系统下的函数调用编程

目录 一、XTerminal下的Linux系统调用编程 1.1理解进程和线程的概念并在Linux系统下完成相应操作 (1) 进程 (2)线程 (3) 进程 vs 线程 (4)Linux 下的实践操作 1.2Linux的“虚拟内存管理”和stm32正式物理内存&#xff08;内存映射&#xff09;的区别 (1)Linux虚拟内存管…...

umi框架开发移动端h5

1、官网&#xff1a;https://umijs.org/ 2、创建出来的项目 yarn create umi yarn start3、推荐目录结构 . ├── config │ └── config.ts ├── public//静态资源 ├── dist ├── mock │ └── app.ts&#xff5c;tsx ├── src │ ├── .umi │ ├── .um…...

TDengine 重磅功能虚拟表

简介 虚拟表功能是 TDengine 最近刚发现的 3.3.6.0 版本中一项重磅级新功能&#xff0c;虚拟表可理解为在原来查询基础上做了一层逻辑表&#xff0c;在数据查询建模时即可不依赖底层物理存储表&#xff0c;直接通过虚拟表进行数据查询建模&#xff0c;这样逻辑上会更加清晰&am…...

3.9/Q2,Charls最新文章解读

文章题目&#xff1a;Association between remnant cholesterol and depression in middle-aged and older Chinese adults: a population-based cohort study DOI&#xff1a;10.3389/fendo.2025.1456370 中文标题&#xff1a;中国中老年人残留胆固醇与抑郁症的关系&#xff1…...

Java Lambda 表达式提升效率

lambda 表达式的应用场景 Stream 的应用场景 Lambda/Stream 的进一步封装 自定义函数式接口&#xff08;用 jdk 自带的函数式接口也可以&#xff09; https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html import java.io.Serializable;/*** 可序…...

人工智能混合编程实践:C++ ONNX进行图像超分重建

人工智能混合编程实践:C++ ONNX进行图像超分重建 前言相关介绍C++简介ONNX简介ONNX Runtime 简介**核心特点**图像超分辨率重建简介应用场景前提条件实验环境项目结构使用C++ ONNX进行图像超分重建sr_main.cpp参考文献前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多…...

K8S学习之基础七十四:部署在线书店bookinfo

部署在线书店bookinfo 在线书店-bookinfo 该应用由四个单独的微服务构成&#xff0c;这个应用模仿在线书店的一个分类&#xff0c;显示一本书的信息&#xff0c;页面上会显示一本书的描述&#xff0c;书籍的细节&#xff08;ISBN、页数等&#xff09;&#xff0c;以及关于这本…...

Python不可变数据类型全解析:原理、优势与实战指南

目录 引言&#xff1a;为什么Python要区分可变与不可变&#xff1f; 一、不可变数据类型的核心特性 二、五大不可变数据类型深度解析 三、不可变数据类型的三大核心优势 四、不可变数据类型的典型应用场景 五、不可变 vs 可变&#xff1a;如何选择&#xff1f; 六、实战技…...

六.FFmpeg对mp4文件操作(ubuntu)

一.抽取aac数据 1.代码抽取aac没有声音&#xff0c;使用ffmpeg命令行也无法转换为wav 问题解决&#xff1a;ADTS头的采样率没有设置正确&#xff0c;av_dump_format 获取视频信息的时候可以看到aac的详细信息。 void Widget::adts_header(char *szAdtsHeader, int dataLen) …...

Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座

在全球 290 位开发者的协作下&#xff0c;Apache Doris 在 2024 年完成了 7000 次代码提交&#xff0c;并发布了 22 个版本&#xff0c;实现在实时分析、湖仓一体和半结构化数据分析等核心场景的技术突破及创新。 2025 年&#xff0c;Apache Doris 社区将秉承“以场景驱动创新…...

HTTP数据传输的几个关键字Header

本文着重针对http在传输数据时的几种封装方式进行描述。 1. Content-Type(描述body内容类型以及字符编码) HTTP的Content-Type用于定义数据传输的媒体类型&#xff08;MIME类型&#xff09;&#xff0c;主要分为以下几类&#xff1a; (一)、‌基础文本类型‌ text/plain‌ …...