mysql: MySQL索引和排序相关名词概念汇总

注意,这些名词并非并列关系,本文仅作概念总结

1 MySQL 索引相关名词

1.1 索引类型与存储关系

名词 概念定义
主键索引、聚簇索引 主键索引是基于表中主键字段创建的索引,用于唯一标识每一行数据。主键索引的主要作用是确保数据的唯一性。 聚簇索引是用来存储表中行数据的特殊索引。在 InnoDB 中,表的行数据实际上存储在聚簇索引中,因此它决定了数据的物理存储顺序。通常情况下,聚簇索引等同于主键索引,但这并非绝对。 如果表中定义了主键,聚簇索引会与主键索引一致。如果没有主键,InnoDB 会选择第一个唯一且非空的索引作为聚簇索引。如果连这样的索引都没有,InnoDB 会自动生成一个隐藏的聚簇索引(名为 GEN_CLUST_INDEX)。 主键索引是逻辑上的唯一性约束,而聚簇索引是物理上的数据存储方式。两者在大多数情况下是相同的,但在没有主键的表中,聚簇索引可能会与主键索引不同。
二级索引(辅助索引) 二级索引是除聚簇索引之外的索引类型,其叶子节点存储索引列值与对应的主键值,而不存储完整行数据。通过二级索引定位记录后,若查询字段不完全包含在索引中,MySQL 需要根据主键值再次访问聚簇索引以获取完整行数据。
覆盖索引 覆盖索引是指一个查询所需的所有列都包含在同一个索引中,查询过程中 MySQL 只需访问索引结构即可返回结果,无需回到聚簇索引中读取完整行数据,从而减少随机 IO 并提升查询性能。
联合索引(组合索引、多列索引) 联合索引是由多个列组成的索引,其内部按索引定义时的列顺序进行排序。MySQL 在执行查询或排序时,会按照索引列的顺序逐层利用索引结构,以缩小扫描范围或直接完成有序输出。
唯一索引、普通索引 唯一索引在逻辑上要求索引列值在表中唯一,MySQL 在写入数据时会进行唯一性校验;普通索引不限制列值重复,仅用于提升查询效率。两者在查询阶段的访问方式一致。
全文索引 全文索引用于对文本字段进行关键词检索,底层采用倒排索引结构,主要服务于 MATCH AGAINST 查询,不参与常规等值查询、范围查询和 ORDER BY 排序过程。
Hash索引 Hash索引通过哈希函数直接定位记录位置,仅支持等值查询,不支持范围扫描和排序。在 MySQL 中主要由 Memory 引擎提供,InnoDB 不使用该索引结构作为通用索引。

2 MySQL 查询相关名词

2.1 查询访问路径

名词(同类合并) 概念定义
主键查询 主键查询是指通过主键索引进行的等值查询。由于主键索引对应聚簇索引结构,MySQL 可以一次索引访问直接定位到完整数据行,查询路径最短,性能最优。
二级索引查询 二级索引查询是指通过辅助索引定位记录的查询方式。当查询字段未被索引完全覆盖时,MySQL 需要根据索引中的主键值再次访问聚簇索引以获取完整行数据。
覆盖索引查询 覆盖索引查询是指查询过程中所需字段全部来自索引结构,MySQL 在执行时无需回表即可返回结果,能够显著降低 IO 成本。
范围查询、等值查询 等值查询使用 = 或 IN 条件在索引中快速定位记录;范围查询使用 >、<、BETWEEN 等条件在 B+Tree 索引中进行顺序扫描。
全表扫描查询 全表扫描查询是指 MySQL 不使用任何二级索引,而是顺序扫描聚簇索引中的全部记录以筛选结果,通常发生在无可用索引或索引失效的场景下。

3 MySQL 排序相关名词

3.1 排序方式与实现

名词(同类合并) 概念定义
索引排序 vs 文件排序 索引排序是指 MySQL 利用索引本身的有序性直接返回有序结果,而无需额外排序操作。只有当 ORDER BY 列的顺序和方向与索引完全一致时,该排序方式才能生效。 文件排序是 MySQL 在无法使用索引完成排序时采用的排序实现方式名称。该排序可能在内存中完成,也可能借助磁盘临时文件完成,其本质是 MySQL 自行实现的一套排序流程v
内存排序 vs 磁盘排序 当排序数据量未超过 sort_buffer_size 时,MySQL 在内存中完成排序;当数据量超出内存限制时,MySQL 会借助磁盘临时文件进行多路归并排序。
单路排序 vs 双路排序 文件排序 分为单路排序双路排序 单路排序在排序阶段同时保存排序键和所需字段,排序完成后直接返回结果; 双路排序在首次排序时仅保存排序键和行标识,排序完成后再访问聚簇索引获取完整行数据。
全量排序、Top-N排序 全量排序对所有满足条件的记录进行排序; Top-N排序在 ORDER BY 与 LIMIT 同时存在时,仅维护排序结果中前 N 条记录,从而减少排序成本。

图,来自面试鸭

3.2 排序与分页

名词(同类合并) 概念定义
普通分页查询 vs 深分页查询 普通分页查询使用 LIMIT OFFSET 且 OFFSET 较小; 深分页查询中 OFFSET 值很大,MySQL 仍需扫描并丢弃 OFFSET 行记录,导致查询性能随着页码增加而明显下降。
相关推荐
fen_fen10 小时前
Oracle建表语句示例
数据库·oracle
砚边数影11 小时前
数据可视化入门:Matplotlib 基础语法与折线图绘制
数据库·信息可视化·matplotlib·数据可视化·kingbase·数据库平替用金仓·金仓数据库
orange_tt12 小时前
Djiango配置Celery
数据库·sqlite
云小逸12 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
·云扬·13 小时前
MySQL Binlog落盘机制深度解析:性能与安全性的平衡艺术
android·mysql·adb
肉包_51113 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
霖霖总总13 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
此刻你14 小时前
常用的 SQL 语句
数据库·sql·oracle
それども14 小时前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql
·云扬·14 小时前
MySQL Binlog 配置指南与核心作用解析
数据库·mysql·adb