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 行记录,导致查询性能随着页码增加而明显下降。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值