后端开发
·04-01 11:38Day01总结
MySql索引类型有哪些?
首先要明白索引是什么
索引是一种用于加速数据查询的数据结构(记这点就可以)
建立在表的一列或多列上
本质是额外的数据结构
查询时可以减少扫描的数据量
索引就是 MySQL 的“目录”,用来加速查询、保证唯一、优化排序和连接,但会增加存储和维护成本。
为什么从这三个方面回答及在突然被问到时候怎么快速回忆(数据结构、存储方式、索引性质,快速回顾就从逻辑,物理,现实使用这三个方面来展开说明)
面试官考察是否具备系统化知识架构能力(简单点:回答要体系化一些)
第一维度:数据结构角度
为什么首先要讲这个?
这是最底层、最本质的分类。索引之所以快,是因为它利用了特定的数据结构来减少磁盘 I/O 次数。不同的数据结构决定了索引的适用场景(如:适合等值查询还是范围查询)。
1.B+ 树索引
为什么是它? 因为它解决了 B 树“非叶子节点也存数据导致树矮胖”的问题。B+ 树的非叶子节点只存键值,不存数据,使得单个页能容纳更多键值,树的高度更矮(通常 3 层就能存几百万数据)。树矮意味着查询时需要的磁盘 I/O 次数少( O(logn) )。
链表设计:叶子节点之间通过双向链表连接。这解释了为什么 B+ 树既适合等值查询(快速定位),又适合范围查询(顺序扫描链表)。
2.哈希索引:利用哈希表,直接定位。时间复杂度是 O(1)O(1) ,但因为是“散列”的,无法进行排序和范围查询。
3.全文索引:本质是倒排索引。这与 B+ 树的“正排索引”(ID -> 内容)相反,它是“词 -> ID 列表”。这是搜索引擎的底层原理,用于解决模糊匹配和大数据量文本检索问题。
总结:考察的是对算法与数据结构的理解,知道“索引的性能瓶颈在于磁盘 I/O”。(如果问到优化,可以从这方面去想)
2. 第二维度:存储方式角度
为什么紧接着讲这个?
这主要针对 InnoDB 引擎(目前 MySQL 最常用的引擎)。这一层考察的是你对物理存储的理解,特别是聚簇索引和回表的概念。
核心逻辑:
聚簇索引:数据和索引绑在一起。
主键就是聚簇索引:InnoDB 中,数据行是按照主键顺序物理存储在磁盘上的。这非常高效,因为查到了索引就查到了数据(一次 I/O)。
为什么只能有一个? 因为数据行在物理磁盘上只能按一种顺序排列。
非聚簇索引:索引和数据分开存。
回表:当你用非主键索引(如普通索引)查询时,数据库先在二级索引中找到主键 ID,然后再拿着这个 ID 去聚簇索引中查找完整的数据行。这个过程叫“回表”。
覆盖索引:如果非聚簇索引的叶子节点已经包含了你要查询的所有字段(比如 select id, name from user where name='xxx',且 name 是索引),就不需要回表了。这是这一层最重要的优化思想。
总结:这一层考察的是对InnoDB 引擎内部机制的掌握,特别是“数据是怎么在磁盘上放的”以及“回表带来的性能损耗”。
3. 第三维度:索引性质角度
为什么最后讲这个?
这是最上层、最贴近业务开发的分类。面试官想知道在实际写代码、建表时,会不会用对索引类型。
核心逻辑:
主键索引:唯一性、非空。作为聚簇索引的锚点。
唯一索引:业务上的唯一约束(如身份证号、邮箱)。它允许有 NULL,但主键不允许。
普通索引:纯粹为了加速查询,没有约束。
联合索引:考察最左前缀原则
原理:联合索引 (a, b, c) 在 B+ 树中是先按 a 排序,a 相同再按 b 排序,以此类推。如果查询条件跳过 a 直接用 b,索引就失效了(因为树的结构决定了你必须从最左边开始找)。
为什么要强调列顺序? 这是面试必问,考察是否具备索引设计能力。
还有全文索引和空间索引
总结:这一层考察的是工程实践能力,即如何根据业务需求选择合适的索引类型,以及如何设计高效的联合索引。
回答每个点时,主动引出相关的高频考点
讲 B+ 树时,主动提“为什么不用红黑树”(红黑树太高,I/O 太多)。
讲非聚簇索引时,主动提“什么是回表”和“如何避免回表”(覆盖索引)。
讲联合索引时,主动提“最左前缀原则”和“索引下推”(ICP)。
面试是有时间的,尽量让大部分时间让自己处在一个高效回答期,尽可能压缩面试官对自己不熟悉领域的考察,问道时候,尽量去联想一些体系化的关键词,然后展开回答
3
4
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
