MySQL索引面试问题梳理

本文系统剖析MySQL索引的核心机制:

  1. 索引分类全景图‌:详解聚簇/非聚簇索引的逻辑差异与物理存储特点
  2. B+树的统治性优势‌:通过对比Hash/B树揭示InnoDB的底层选择逻辑

一、索引分类的常见困惑解析

1. 按物理存储分类

类型

存储内容

数量限制

特点

代表引擎

聚簇索引

数据行本身

每表1个

数据即索引

InnoDB主键

非聚簇索引

主键引用

多个

需回表查询

MyISAM/InnoDB二级索引

2. 按逻辑功能分类

索引类型

键约束

NULL值处理

数量限制

是否聚簇

典型创建语句

适用场景

主键索引

唯一且非空

禁止NULL

每表1个

是(InnoDB)

ALTER TABLE t ADD PRIMARY KEY(id)

行唯一标识,快速定位

唯一索引

唯一但允许NULL

允许NULL

多个

CREATE UNIQUE INDEX idx_name ON t(name)

防止重复值,如手机号

普通索引

允许重复值

允许NULL

多个

CREATE INDEX idx_age ON t(age)

加速高频查询条件

全文索引

无唯一性约束

允许NULL

多个

ALTER TABLE t ADD FULLTEXT(content)

文本内容搜索

空间索引

无唯一性约束

禁止NULL

多个

ALTER TABLE t ADD SPATIAL INDEX(pt)

GIS地理坐标查询

3. 按数据结构分类

类型

数据结构

支持引擎

适用场景

B+Tree索引

平衡多路树

InnoDB/MyISAM

99%场景

Hash索引

哈希表

Memory引擎

精确匹配

R-Tree索引

空间树

MyISAM

地理数据

Full-text索引

倒排索引

InnoDB/MyISAM

文本搜索

、InnoDB为何选择B+树作为索引结构?‌

1.常见索引数据结构对比‌

在数据库系统中,不同的索引数据结构适用于不同的查询场景。以下是几种主流索引结构的对比:

数据结构

查询复杂度

范围查询

磁盘I/O效率

适用场景

代表存储引擎

Hash索引

O(1)

❌ 不支持

❌ 随机I/O高

精确匹配(如=IN

Memory引擎

二叉搜索树

O(log n)

✅ 支持

❌ 树高不可控

内存型数据

较少使用

AVL/红黑树

O(log n)

✅ 支持

❌ 树高仍较高

内存型数据

较少使用

B树

O(log n)

✅ 支持

✅ 较优

磁盘存储

MongoDB(B树变种)

B+树

O(log n)

✅ 支持

✅ 最优

磁盘存储(范围查询)

InnoDB、MyISAM

关键结论‌

  • Hash索引‌:仅适合精确查询,无法支持范围查询(如><BETWEEN)。
  • 二叉/平衡树‌:树高不可控,导致磁盘I/O次数增加,不适合大规模数据存储。
  • B树‌:相比B+树,非叶子节点存储数据,导致单页存储的索引键减少,树高可能更高。
  • B+树‌:‌InnoDB的默认选择‌,具有更稳定的查询性能、更低树高、更优的范围查询支持。

2. B+树的核心优势‌

‌(1) 更低的树高,减少磁盘I/O‌
  • B+树‌的‌非叶子节点仅存储索引键‌(不存储数据),因此单页可容纳更多索引项,树高更低。
(2) 天然支持高效范围查询‌
  • B+树的所有数据均存储在叶子节点‌,并按顺序形成链表,范围查询只需遍历叶子节点。
‌(3) 更适合磁盘存储‌
  • B+树的叶子节点形成有序链表‌,减少随机I/O,提高顺序读取性能(适合机械硬盘)。
  • B树的节点存储数据‌,可能导致更多的随机I/O。
‌(4) 更高的缓存命中率‌
  • 非叶子节点仅存储索引键‌,可缓存更多索引结构,减少磁盘访问。

3. InnoDB为何不选择Hash/B树?‌

对比项

B+树

Hash索引

B树

范围查询

✅ 高效

❌ 不支持

✅ 支持但效率较低

磁盘I/O

✅ 顺序读取优化

❌ 随机I/O高

✅ 一般

树高控制

✅ 最优

❌ 不适用

⚠️ 比B+树略高

缓存友好

✅ 非叶子节点可缓存

❌ 无优化

⚠️ 数据分散

InnoDB的选择逻辑‌

  1. OLTP(在线事务处理)‌ 需要大量‌范围查询‌(如分页、排序),B+树最合适。
  2. 机械硬盘时代‌,B+树的顺序I/O优势明显(即使SSD时代仍受益)。
  3. B树的数据存储方式‌导致单页索引键减少,可能增加树高。

三、联合索引失效场景

见我的博客《‌MySQL索引失效12种场景:用架构分层思想优化实战》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88064.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSH密钥 与 Ed25519密钥 是什么关系

SSH 密钥与 Ed25519 密钥的关系可以从技术实现和应用场景两个角度理解。简而言之&#xff1a;Ed25519 密钥是 SSH 密钥的一种类型&#xff0c;用于在 SSH 协议中实现安全认证。以下是详细解释&#xff1a; 1. SSH 密钥的通用概念 SSH&#xff08;Secure Shell&#xff09;是一…

【PyTorch 当前版本不支持 NVIDIA GeForce RTX 5060 Ti处理办法】

报错信息 X:\Stable-Diffusion-WebUI\system\python\lib\site-packages\torch\cuda\__init__.py:215: UserWarning: NVIDIA GeForce RTX 5060 Ti with CUDA capability sm_120 is not compatible with the current PyTorch installation. The current PyTorch install supports…

Docker部署PaddleX实现PaddleOcr

Docker部署PaddleX实现PaddleOcr 一、版本说明二、安装PaddleX三、基础服务化部署四、接口调用实现表格识别五、调参优化一、版本说明 PaddleX 3.0Ubuntu20.04.1Docker version 26.1.3, build 26.1.3-0ubuntu1~20.04.1二、安装PaddleX 查看服务器信息 docker安装PaddleX 根据 …

深入学习c++之---AVL树

VL树简介​ AVL树是一种自平衡二叉搜索树&#xff0c;通过平衡因子&#xff08;Balance Factor, BF&#xff09;​和旋转操作&#xff0c;确保树始终保持平衡&#xff0c;避免退化成链表&#xff0c;从而保证查找、插入、删除的时间复杂度稳定在 ​O(log n)​。 ​核心特点​…

【PTA数据结构 | C语言版】输出 1 ~ n

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 给定正整数 n&#xff0c;输出 1 ~ n&#xff0c;每个数字占一行。 本题旨在测试不同的算法在各种数据情况下的表现。各组测试数据特点如下&#xff1a; 数据 0&#xff1a;测试基本正确性&#x…

如何禁止用户复制页面内容?

某些特定的业务场景下&#xff0c;我们可能会有禁止用户复制页面内容的需求。比如&#xff1a; 付费内容保护&#xff1a;在线小说、付费课程等&#xff0c;希望防止内容被轻易拷贝和传播。试卷或答题系统&#xff1a;防止考生将题目复制出去寻求场外帮助。敏感信息展示&#x…

React + PDF.js 预览 PDF 文件:从基础实现到高级优化的完整指南

关键点 PDF.js&#xff1a;Mozilla 开发的开源 JavaScript 库&#xff0c;用于在浏览器中渲染 PDF 文件。React 集成&#xff1a;结合 React 组件化特性&#xff0c;实现高效、交互式的 PDF 预览功能。功能实现&#xff1a;支持 PDF 文件加载、页面导航、缩放、搜索、书签和注…

新能源汽车BMS电感产品应用及选型推荐

在新能源电动汽车中&#xff0c;BMS&#xff08;电池管理系统&#xff09;如同一个守护者&#xff0c;默默守护电池的安全与性能。它精准监控电压、电流、温度&#xff0c;防止过充过放&#xff0c;并通过智能均衡技术提升续航能力。电感在BMS系统的电源转换、滤波和隔离通信等…

【机器学习笔记 Ⅱ】12随机森林

随机森林&#xff08;Random Forest&#xff09;详解 随机森林是一种基于集成学习&#xff08;Ensemble Learning&#xff09;的高性能分类/回归算法&#xff0c;通过构建多棵决策树并综合其预测结果&#xff0c;显著提升模型的准确性和鲁棒性。其核心思想是“集体智慧优于个体…

问题 1:MyBatis-plus-3.5.9 的分页功能修复

问题 1&#xff1a;MyBatis-plus-3.5.9 的分页功能修复 使用 Sw‏agger 接口文档‎依次对上述接口进行测 试&#xff0c;发现 listU⁡serVOByPage 接口有一些问题&#xff01; 分页好像没有生效&#xff0c;还是查出了全部数据&#xff1a; 由于我们用的是 MyBatis Plus 来操…

Qt 如何提供在线帮助

Qt 如何提供在线帮助一、概述二、工具提示、状态提示和"Whats This?"帮助1、工具提示(Tool Tips)添加工具提示到控件富文本工具提示全局工具提示设置延迟显示控制自定义工具提示窗口禁用工具提示工具提示与状态栏联动特点&#xff1a;2、状态提示(Status Tips)3、&q…

Typecho站点关闭插件开发全指南:从原理到实现

文章目录 开发Typecho站点关闭插件:从原理到实现一、背景与需求分析二、插件设计思路2.1 技术选型2.2 功能模块设计三、插件开发实现3.1 插件基础结构3.2 插件主文件实现3.3 核心功能实现3.4 后台管理界面3.5 关闭页面模板四、插件配置完善4.1 配置表单实现4.2 定时任务处理五…

详细解析 .NET 依赖注入的三种生命周期模式

文章目录一、Transient&#xff08;瞬时生命周期&#xff09;原理使用方式核心特性适用场景优势劣势二、Scoped&#xff08;作用域生命周期&#xff09;原理使用方式核心特性适用场景优势劣势三、Singleton&#xff08;单例生命周期&#xff09;原理使用方式核心特性适用场景优…

软件工程经济与伦理

前言 各位帅哥美女&#xff0c;能看到这篇博客的都有口福了&#xff0c;学习这门课程就像遨游在大份的海洋&#xff0c;一不小心就吃上一口。能看到这篇博客说明我们是有缘人可以点赞收藏一下&#xff0c;这篇博客可以在你无比饥饿的时候给你送上一坨&#xff01;&#xff08;香…

AI 体验走查 - 火山引擎存储的 AI UX 探索之路

01 概述 火山引擎存储技术团队驱动 AI 自主完成用户体验走查 / 可用性测试的执行与评价&#xff0c;帮助业务改善交互体验。 立项“故事走查”的背景诉求和 AI 机遇 如何搭建“AI 评价”能力&#xff0c;精准识别交互问题 让交互体验故事走查变为技术产品&#xff0c;讲解系…

【世纪龙科技】汽车零部件检验虚拟实训室-助力汽车职教实训

在汽车产业加速向电动化、智能化转型的背景下&#xff0c;职业院校汽车专业教学面临新的挑战&#xff1a;传统实训受限于设备数量不足、操作风险高、标准化程度低等问题&#xff0c;导致学生实践机会有限&#xff0c;技能掌握不扎实。如何让学生在有限资源下高效掌握零部件检验…

MySQL常用操作 查看表描述以及表结构、连接数及缓存和性能指标

查看表描述以及表结构查看数据库名SHOW DATABASES; SELECT DATABASE(); SELECT DATABASE() AS current_database;查看数据库中表的列表SHOW TABLES; SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA your_database_name; SELECT TABLE_NA…

音视频学习(三十六):websocket协议总结

概述项目描述标准RFC 6455使用端口默认 80&#xff08;ws&#xff09;&#xff0c;443&#xff08;wss&#xff09;基于协议TCP特性全双工、低开销、持久连接、可穿透代理特点 全双工通信&#xff1a; WebSocket 允许客户端和服务器之间建立一个持久的连接&#xff0c;并且数据…

docker版本nacos的搭建

1.下载镜像2.拷贝出容器中对应的配置文件&#xff0c;logs&#xff0c;data&#xff0c;conf3.编写yaml配置文件version: 3.8 services:nacos-server:image: nacos/nacos-server:v2.4.0container_name: nacos-serverrestart: unless-stoppedports:- "8848:8848" # …

【机器学习深度学习】 如何解决“宏平均偏低 / 小类识别差”的问题?

目录 &#x1f9e9; 场景 一、先问清楚&#xff1a;小类差&#xff0c;到底差在哪&#xff1f; 二、对症下药&#xff1a;六大优化策略&#xff08;分类任务专用&#xff09; ✅ 1. 处理类别不平衡&#xff08;最常见&#xff09; ✅ 2. 优化数据质量 ✅ 3. 更强的模型结…