网站首页 > 技术文章 正文
以下是MySQL索引及其原理的深度解析,结合B+树结构、聚簇索引设计等核心机制进行说明:
一、索引的本质与目的
核心定义
索引是帮助MySQL高效获取数据的数据结构,类似于书籍目录,通过缩小查询范围避免全表扫描。
存储原理:以空间换时间,索引本身占用磁盘/内存空间,但显著提升查询速度
典型场景:WHERE子句频繁查询的列、排序/分组字段、外键关联列
B+树的核心优势
InnoDB默认使用B+树索引结构,相比B树和哈希表具备以下特性:
叶节点链表:支持高效范围查询(如WHERE id > 100)
高扇出性:单次I/O可加载更多键值(默认16KB页大小),减少磁盘访问次数
数据有序性:叶节点按键值排序,优化排序和分组操作
二、索引类型与实现差异
索引类型 存储特点 查询逻辑 适用场景
聚簇索引 叶节点直接存储完整数据行(InnoDB主键) 无需回表,主键查询最快 主键或唯一高频查询列
二级索引 叶节点存储索引列+主键值 需回表查询(通过主键二次查找) 非主键但需索引的列
联合索引 多列组合排序(如(a,b,c)) 最左匹配原则(a、a,b有效) 多条件组合查询
示例:回表查询流程
sql
Copy Code
-- 假设name字段有二级索引
SELECT * FROM users WHERE name = 'Alice';
通过二级索引找到name=Alice的主键值
通过主键值在聚簇索引中定位完整数据行
三、索引的代价与优化
写入代价
增删改操作需同步更新索引,降低写入性能
页分裂问题:不规则插入导致B+树频繁调整
设计原则
避免冗余索引:联合索引(a,b)可覆盖单列索引(a)的需求
低区分度列慎用:如性别列(值重复率高)索引效果差
覆盖索引优化:索引包含查询所需字段可避免回表
sql
Copy Code
-- 覆盖索引示例(只需查id和name)
SELECT id, name FROM users WHERE name LIKE 'A%';
四、索引失效场景
以下操作会导致索引失效:
左模糊匹配:LIKE '%abc'
隐式类型转换:WHERE id = '100'(id为整型)
联合索引非最左匹配:INDEX(a,b)但条件仅WHERE b=1
对索引列使用函数:WHERE YEAR(create_time) = 2025
五、InnoDB索引页结构
结构部分 作用
页目录 加速页内记录定位(类似二分查找)
用户记录区 存储实际索引键值和数据指针
页头信息 记录页类型、前后页指针等元数据
通过B+树的多层目录页(非叶节点)和有序数据页(叶节点)协同工作,实现高效查询。
- 上一篇: 性能测试——测试常见的指标(测试性能指标有哪些)
- 下一篇: JS对象判空的几种方式,你真的会了吗?
猜你喜欢
- 2025-06-10 性能测试——测试常见的指标(测试性能指标有哪些)
- 2025-06-10 mysql中的分区表和合并表详解(一个常见知识点)
- 2025-06-10 Oracle优化-建立索引(三)(oracle 索引优化)
- 2025-06-10 MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
- 2025-06-10 你写的 SQL 查询为什么总是慢?揭秘 MySQL 索引机制与联合索引
- 2025-06-10 回表、覆盖索引(sqlserver覆盖索引)
- 2025-06-10 数据库主从复制,读写分离,分库分表,分区详解
- 2025-06-10 如何在在量化交易程序中高效使用sqlite
- 2025-06-10 「Python数据分析」Pandas进阶,使用merge()函数合并数据
- 2025-06-10 海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)