百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文
如何理解Mysql的索引及他们的原理?

如何理解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+树的多层目录页(非叶节点)和有序数据页(叶节点)协同工作,实现高效查询。