MySQL 索引原理

news/2025/2/7 4:11:21/

索引(Index)是 MySQL 用来提高查询效率的数据结构。索引的核心原理是 通过减少数据扫描的范围,提高查询性能。索引类似于一本书的目录,可以加快查找的速度。

1. 索引的底层数据结构

MySQL 主要使用两种索引数据结构:

  • B+ 树(B+Tree)索引(最常用)
  • 哈希(Hash)索引

1.1 B+ 树索引

B+ 树是一种平衡多路搜索树,其特点:

B+ 树索引的优点

B+ 树索引的缺点

Hash 索引的优缺点

  • 有序性:B+ 树索引存储的是有序的键值对,可以加速范围查询和排序操作。
  • 磁盘友好:B+ 树的每个节点存储多个键值,减少磁盘 I/O。
  • 所有数据存储在叶子节点,非叶子节点只存储索引,提高查询效率。
  • B+ 树索引的工作方式

    假设有如下 SQL 语句:

  • SELECT * FROM users WHERE age = 25;
    

  • MySQL 通过索引树的根节点开始查找,逐层查找对应的叶子节点。
  • 叶子节点中存储了对应的数据行地址,然后通过该地址读取完整数据。
  • 适用于单点查询=)、范围查询BETWEEN> <)、排序查询ORDER BY)。
  • 不适用于频繁变更的字段,因为增删改可能会引起索引重建,影响性能。
  • 适用于大数据量查询,但索引维护会占用一定的存储空间。
  • 由于 B+ 树有有序性,在范围查询和排序时可以避免额外的排序操作。
  • 1.2 Hash 索引

    Hash 索引基于 哈希表(Hash Table) 结构:

  • 通过哈希函数计算键的哈希值,并存储到哈希表中。
  • 查询时通过哈希值直接找到对应的存储位置。
优点缺点
适用于等值查询=不支持范围查询(BETWEEN><
查询速度快(哈希查找 O(1))无法支持 ORDER BY,因为哈希值是无序的
适用于唯一键查询发生哈希冲突时,查询效率下降

    适用场景
    • Memory 引擎默认使用 Hash 索引。
    • 适用于等值查询,如 WHERE id = 100,但不适用于范围查询。

     

    2. 索引类型

    MySQL 主要有以下几种索引:

    索引类型说明适用场景
    主键索引(Primary Key)B+ 树索引,唯一且非空作为表的唯一标识
    唯一索引(Unique Index)B+ 树索引,保证列值唯一需要唯一性约束的列(如邮箱、用户名)
    普通索引(Index)B+ 树索引,不强制唯一经常用于 WHERE 查询的字段
    联合索引(Composite Index)由多个列组成的索引适用于多列组合查询
    全文索引(Full-Text Index)适用于文本搜索(InnoDB / MyISAM)搜索大段文本
    哈希索引(Hash Index)哈希表结构,只适用于等值查询仅用于 Memory 引擎

    3. 聚簇索引和 非聚簇索引

    在 MySQL 中,索引的存储方式决定了查询效率,其中聚簇索引和非聚簇索引是最核心的两种索引类型。

    3.1. 聚簇索引(Clustered Index)

    定义

    • 数据存储和索引放在一起,即 索引即数据,数据即索引
    • B+ 树的叶子节点直接存储整行数据,主键索引就是聚簇索引。

    3.1.1 主要特点

    • 存储顺序 = 索引顺序:数据按照 主键值 的顺序物理存储。
    • 查询效率高:查找主键时,无需额外访问数据页。
    • 范围查询快:因为数据是有序存储的,范围查询 (BETWEEN> < 等) 非常高效。
    • 表只能有一个聚簇索引:因为数据只能按一种方式物理存储。

    3.1.2 MySQL 的实现

    • InnoDB 存储引擎默认使用 主键作为聚簇索引
    • 如果没有主键,InnoDB 会选择一个 UNIQUE 索引 作为聚簇索引。
    • 如果都没有,InnoDB 会自动创建一个隐藏的 rowid 作为聚簇索引

    3.2. 非聚簇索引(Non-Clustered Index)

    定义

    • 索引存储与数据分开,索引存储的是 键值 + 指向数据行的地址(主键 ID)。
    • 需要先查找索引,再通过索引找到对应的数据行,即 "回表查询"

    3.2.1 主要特点

    • 索引和数据存储在不同的位置,索引只包含键值 + 记录指针。
    • 非聚簇索引可以有多个,支持多列索引(如 emailusername)。
    • 查询时可能需要回表,即先通过索引查找主键,再回表查询完整数据。

    3.2.2 MySQL 的实现

    • InnoDB 的二级索引(普通索引、唯一索引等)都是 非聚簇索引
    • 二级索引存储的是主键值,而不是数据行的物理地址
    • 如果查询的是非主键字段,则需要回表查询

    特性聚簇索引(Clustered Index)非聚簇索引(Non-Clustered Index)
    存储方式数据和索引存储在一起数据和索引存储在不同的地方
    索引叶子节点存储完整数据行主键 ID
    查询主键时直接查找数据,速度快需要回表查询,速度慢
    范围查询更快(数据顺序存储)较慢(数据不连续存储)
    索引个数只能有一个可以有多个
    适用场景主键查询、范围查询非主键查询、联合索引

     


    http://www.ppmy.cn/news/1569977.html

    相关文章

    python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算

    【0】基础定义 按位与运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;全1取1&#xff0c;其余取0。 按位或运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;有1取1&#xff0c;其余取0。 按位异或运算&#xff1a; 两个等长度二进制数上下对齐&#xff0c;相…

    C_位运算符及其在单片机寄存器的操作

    C语言的位运算符用于直接操作二进制位&#xff0c;本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。 一、位运算符的简单说明 1、按位与运算符&#xff08;&&#xff09; 功能&#xff1a;按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…

    中国城商行信贷业务数仓建设白皮书(第一期:总体规划)

    一、项目背景与行业现状 1.1 国内城商行信贷业务痛点 2024年统计数据显示:全国134家城商行平均历史数据处理延迟达37小时/次 传统Oracle架构日均处理能力上限仅为320万笔交易 客户特征维度不足(现行系统平均维护86个客户标签) 监管报表生成耗时超同业股份制银行2.3倍 1.2 H…

    代码随想录二刷|回溯1

    回溯 组合问题 方法 组合 题干 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 思路 &#xff08;1&#xff09;定义全局变量数组&#xff0c;作为存放组合的数组和存放最终答案的数组 &#xff08;2&…

    二叉树03(数据结构初阶)

    文章目录 一&#xff1a;实现链式结构二叉树1.1前中后序遍历1.1.1遍历规则1.1.2代码实现 1.2结点个数以及高度等1.2.1二叉树结点个数1.2.2二叉树叶子结点个数1.2.3二叉树第k层结点个数1.2.4二叉树的深度/高度1.2.5 二叉树查找值为x的结点1.2.6二叉树的销毁 1.3层序遍历1.4判断是…

    【starrocks学习】之将starrocks表同步到hive

    目录 方法 1&#xff1a;通过HDFS导出数据 1. 将StarRocks表数据导出到HDFS 2. 在Hive中创建外部表 3. 验证数据 方法 2&#xff1a;使用Apache Spark同步 1. 添加StarRocks和Hive的依赖 2. 使用Spark读取StarRocks数据并写入Hive 3. 验证数据 方法 3&#xff1a;通过…

    20-30 五子棋游戏

    20-分析五子棋的实现思路_哔哩哔哩_bilibili20-分析五子棋的实现思路是一次性学会 Canvas 动画绘图&#xff08;核心精讲50个案例&#xff09;2023最新教程的第21集视频&#xff0c;该合集共计53集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https:…

    电路研究9.2.6——合宙Air780EP中HTTP——HTTP GET 相关命令使用方法研究

    这个也是一种协议类型&#xff1a; 14.16 使用方法举例 根据之前多种类似的协议的相关信息&#xff1a; HTTP/HTTPS&#xff1a;超文本传输协议&#xff08;HTTP&#xff09;用于Web数据的传输&#xff0c;而HTTPS是HTTP的安全版本&#xff0c;使用SSL/TLS进行加密。与FTP相比&…