MySQL索引的实现和使用 -- B+树的实例

本文详细介绍了MySQL中索引的实现,包括B+树索引的工作原理,不同类型的索引如主键索引、唯一索引、普通索引以及聚簇和非聚簇索引的区别。还讨论了B+树的优势,如空间利用率高、IO效率高以及查询效率稳定,并解释了为何选择B+树而非其他数据结构。同时,文章提到了索引的创建、最左匹配原则以及如何分析SQL的执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

前言:索引是数据库中常用的一种数据结构,对于大量数据的表结构中,实现快速查询离不开索引的帮助,本文简单介绍MySQL中索引的实现以及使用

在你想要了解索引之前,掌握树的数据结构是必要的,请先阅读 数据结构之树

索引

分类

索引按种类分为主键索引唯一索引普通索引 
按数据结构分为B+树索引哈希索引 
按创建类型分聚簇索引非聚簇索引

-  聚簇索引就是以主键创建的索引 
- 非聚簇索引就是以非主键创建的索引 
- 聚簇索引在叶子节点存储的是表中数据,非聚簇存的是主键和索引列 
- 非聚簇查询时,拿到主键再去查找想要的数据(回表

Mysql对索引的支持

其中非,这里的BTREE实际上都是代表的B+树,而且我们可以看到的是,常规主流的InNoDB和MyISAM的索引,都是使用的BTREE索引,所以理论上来说,我们是无法人为创建一个哈希索引,哪怕加上using hash,但在特殊情况下,存储引擎会自动优化创建哈希索引

基本概念

首先我们要知道数据库是如何存储数据的

上面的图片代表一 ,一页为4K大小
每个数据页组成一个双向链表 
而每个数据页中的记录又组成一个单向链表 
其中每一页都会根据主键生成一个页目录,可利用二分法快速定位 
以其他列做搜索条件时只能从最小记录开始依次遍历,检索每一页

### B+索引的关系及其实现数据库中的应用 #### 什么是B+? B+是一种多路平衡查找,具有良好的磁盘I/O性能顺序访问能力。它通过将数据集中存储在叶子节点上来优化范围查询顺序扫描操作[^1]。 #### B+的特点及其优势 - **所有数据集中在叶子节点**:这使得B+能够支持高效的范围查询,因为所有的实际数据都在同一层(即叶子节点),便于连续遍历[^2]。 - **更高的扇出度**:相比红黑其他二叉搜索,B+允许每个节点拥有更多子节点,从而降低了的高度,减少了磁盘寻道次数[^3]。 - **更好的空间利用率**:尽管内部节点仅保存索引信息可能导致一定浪费,但由于其紧凑的设计以及较低的高度,整体的空间利用效率仍然很高[^2]。 #### 数据库中如何使用B+作为索引结构? 在关系型数据库MySQL中,尤其是采用InnoDB存储引擎的情况下,主键索引通常是基于B+构建的。这意味着每一条记录不仅可以通过主键快速定位到具体位置,而且整个表的数据实际上是以聚簇形式按照主键顺序排列并存储于B+的叶节点之中[^4]。 对于主键字段上的普通索引,则会建立独立的一颗多棵形结构——辅助索引(Secondary Index)。这类索引同样遵循B+模式,在其中维护指向对应行物理地址的信息而直接包含完整的记录内容。 以下是关于这两种主要类型的简单描述: ##### 主键索引 (Clustered Index) - 所有的数据都被组织成一颗大而深邃的B+- 查找某个特定值时只需沿着路径向下直至找到目标即可完成检索过程; - 插入新条目者删除现有项也会自动调整保持整棵处于平衡状态以便后续继续高效运作。 ```sql CREATE TABLE example ( id INT PRIMARY KEY, -- 这里定义了一个名为id 的自增列为主键 name VARCHAR(50), age TINYINT UNSIGNED, ); ``` 上面SQL语句创建了一张带有三个属性的小表格,并指定`id`列为它的主关键字。这样做的结果就是在后台默默建立起了一棵以ID为依据排序的大规模B+实例供以后执行各种DML命令时候调用。 ##### 辅助索引 (Non-clustered / Secondary Indices) 除了主键之外还可以针对其他任意数量的不同条件分别设立额外单独存在的小型化版本B+来进行加速过滤筛选工作流程。比如下面例子展示了怎样给姓名这一栏加设次级指引器: ```sql ALTER TABLE example ADD INDEX idx_name(name); -- 此处新增了一个叫做idx_name的名字索引来提高按名字搜素的速度 ``` 每次当我们尝试从这个修改后的样例集合里面提取满足某些特殊要求的结果集的时候,系统将会优先考虑是否存在匹配当前请求参数特征的最佳候选者之一—也就是之前预先准备好的那些专门用途定制化的微型版B+木料清单列表里的成员们;如果确实存在的话则可以直接跳转过去获取最终答案而不是重新全量扫描一遍原始资料源文件夹再逐一核验符合条件与否的过程了! --- ### 技术细节探讨 考虑到现代计算机体系架构特点以及硬盘随机读写成本远高于连续块状传输等因素影响下,选用具备如下特性的算法模型显得尤为重要: - 支持批量加载/卸载大批量相邻单元格群组的能力; - 可以轻易扩展适应海量级别以上的庞大数据总量需求场景而不至于崩溃瘫痪掉; - 同时兼顾到了单点精确命中率极高的即时响应速度诉求同时也照顾好了区间片段覆盖式的模糊近似估计统计分析类应用场景的实际业务价值体现出来等方面综合考量过后才决定采纳目前普遍流行的这种经典设计方案作为默认选项推荐给大家使用的标准范式框架基础之上进一步深入研究探索下去吧! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值