-
如何理解Mysql的索引及他们的原理?
- 网站名称:如何理解Mysql的索引及他们的原理?
- 网站分类:技术文章
- 收录时间:2025-06-05 14:46
- 网站地址:
“如何理解Mysql的索引及他们的原理?” 网站介绍
以下是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+树的多层目录页(非叶节点)和有序数据页(叶节点)协同工作,实现高效查询。
- 最近发表
-
- 联想推出 IdeaPad 14s / 15s:均为 3399 元,运行 Win11 系统
- 顶配版ThinkPad X1 Carbon评测
- 联想ThinkPad X1 Carbon评测
- lenovo联想 拯救者-14 加装ssd、内存及win10转移到ssd经验谈
- 联想发布新款耳机鼠标等配件:专为ThinkPad X1设计
- 杜比全景音体验,联想K4 Note在印度正式发布
- 3099 元起,联想推出 IdeaPad 15:约10小时续航,预装 Win11系统
- 联想拯救者Y70、小新Pad Pro 2022发布丨拯救者Y70测评体验
- 千元可定制!联想K4 Note印度发布:杜比全景音体验
- 声临其境 联想TAB2 A10平板联手杜比
- 标签列表
-
- serv-u 破解版 (6)
- 极域电子教室2009 (6)
- 6300主题下载 (1)
- oracle11204下载 (1)
- c++论坛 (14)
- huaweiupdateextractor (4)
- thinkphp6下载 (7)
- 前端论坛 (11)
- mysql 时间索引 (13)
- mydisktest_v298 (35)
- unlocker208 (1)
- sql 日期比较 (33)
- document.appendchild (35)
- 头像打包下载 (35)
- 二调符号库 (23)
- oppoa5专用解锁工具包 (8)
- acmecadconverter_8.52绿色版 (25)
- oracle timestamp比较大小 (7)
- chm editor破解版 (7)
- throttlestop防止降频 (9)
- f12019破解 (16)
- 流星蝴蝶剑修改器 (18)
- pygame中文手册 (2)
- 联想杜比音效驱动下载 (10)