深入理解InnoDB索引数据结构和算法

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
简介: 1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。**总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。

 

文本学习研究InnoDb索引数据结构和算法,从而弄明白为什么添加索引之后查询速度会有质的提升。

有人说“索引就像目录,当然快啦”,这个回答任谁都不能接受吧。至少我认为面试官肯定不满意。

抛问题:

1. 什么是索引?

2.InnoDB的数据结构是?为什么选这个数据结构?



一、索引

  1. 什么是索引?
    我经常问面试者,什么是索引?如果是你该怎么回答?先给出自己的答案,再用三个10原则提问自己
    三个10原则:
           10分钟之后再思考一下自己刚刚的回答是否满意,
           10小时之后再思考一下自己刚刚的回答是否满意,
           10天之后再思考一下自己刚刚的回答是否满意,


    停几分钟思考一下。

      定义:索引是为提升查询速度的排好序的数据结构。
           是数据结构应该好理解,
           思考:为什么是排好序的?

  2. 索引类型及应用场景
索引类型 描述 应用场景
普通索引

定义:基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度

特点:允许重复值、允许为空

创建语句:create index `索引名称` on 表名(列名 排序规则) using 使用的数据结构;

唯一索引

定义:与普通索引类似,不同的是创建唯一性索引的目的1是为了提高访问速度,2是为了避免数据出现重复

特点:数据不重复

创建语句:create union index `索引名称` on 表名(列名 排序规则) using 使用的数据结构;

为提升查询速度的同时又要保证数据的唯一性时
主键索引

定义:主键索引是一种特殊的唯一索引

特点:不允许值重复,不允许值为空

创建语句:不能用create index来创建,是用primary key 来创建

mysql中任何一张都有主键索引,如果创建表时没有指定字段为主键,mysql会自动创建一个隐藏的主键索引。
空间索引

定义:空间索引是对空间数据类型的字段建立的索引,使用 SPATIAL 关键字进行扩展

特点:NOT NULL,地理空间数据类型

创建语句:索引类型换成spatial即可


空间索引用于地理空间数据类型 GEOMETRY。在平时的工作中很少用到(我是从来没用过)。
全文索引

定义:全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引

特点:允许重复值和空值,只能用于创建 char,varchar,text 类型的列

创建语句:CREATE FULLTEXT INDEX `索引名称` ON 表名(列名);

用于全文检索时。

但是如果业务中明确需要全文检索,或者需要根据关键词搜索出匹配的内容,那用 ES 就比较好。

二、索引数据结构

创建索引语法:CREATE 索引类型 INDEX 索引名称 ON 表名(列名 索引排序规则)USING 数据数据结构(eg: create unique index `idx_test_col1` on test(col1 asc )using btree)

用Navicat工具可以很直观看到 using 后面除了btree 还有hash(本次不讨论hash)


直接给结论:树的高度决定IO的次数,IO次数越少,查询速度越快。

2.1  数据结构

btree是一种树结构,树有如下数据结构:

  • 普通二叉树
  • 平衡二叉树
  • b-tree
  • b+tree

树的特点:左子节点小于等于父节点,右子节点大于等于父节点。

所以左子节点一定小于等于右子节点,所以可以说所有子节点,多左到右是排好序的。

2.2 普通二叉树

假设用普通二叉树来做为索引的存储结构,假设表的主键是int的自增主键,那么随便数据的插入,根据树的特点,边子节点大于等于父节点,那么普能二叉树结构构建的索引树最终的形态会像一个键表,如下图:

image.png

image.gif

成了一个链表,根据链表的特点(链表可以看这个 ),如果有100万条数据,那么树的高度就有100万,很显示是不合适的。

2.3 平衡二叉树

平衡二叉树特点看这个,高度计算:h = log2(N+1),h约等于20,说明最坏的情况要做20次IO才能找到想要的数据。一次查询要走20次IO,如果同一时间内有100次查询就是2000次IO,搞不好服务就挂了,所以也不合适。

2.4 b-tree

结构如下图:

image.png image.gif

从图中可以看出

  • 每个节点存放的索引信息是不重复的
  • 索引信息不重复,那么索引信息和数据信息就放在一起的,所以每个节点能放的索引信息就变没多少。
    mysql默认的一叶数据大小为16kb,假如表每行的数据为1kb,那个每个节点只能放16个索引信息,假设表有100万条数据,16 * 16 * 16 * 16 * 16 = 1048576,树高度也有5

    看似树的高度大大减少了,如上图,如果是范围查询,跨数据叶查询,若查小于等小5的数据,如果先找到0000,0001,0002,要找到0004必须要回到父节点再到0004节点,对于100万条数据的树结构,很有可能要回很多个父节点。实际的IO次数是5的倍数。所以也不合适。

       由此B+ tree出现

2.5 b+tree

结构如下:

image.png

从图中可以看出

  • 叶子中包含所有非叶子节点的信息(则非叶子节点能存放更多的索引信息)
  • 叶子节点有一个箭头指向另一个叶子节点

    在mysql中使用B+Tree来作为索引的存储结构还做了修改
    叶子间的箭头是双向指向的,则对于跨数据叶的范围查询就不用返回到父点再找到另一个数据叶的数据了,相对物B- tree大大减少了IO次数。
    非叶子节点只存放索引信息,数据信息全部存放到叶子节点中。


    对于高度为3,B+tree能丰放多少呢请查看上一篇文章,这里不再计算。


    结论:非叶子节点能存放的索引信息越多,树的高度就越低,IO次数就越少,获取数据的速度就越快
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
机器学习/深度学习 存储 算法
【数据结构】算法的复杂度
算法的时间复杂度和空间复杂度
16 1
【数据结构】算法的复杂度
|
2天前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
9 1
|
7天前
|
算法 安全 调度
逆天改命!Python高级数据结构堆(Heap)与优先队列,让你的算法效率飙升至宇宙级!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue实现了堆和优先队列,提供高效算法解决方案。堆用于Dijkstra算法求解最短路径,例如在图论问题中;PriorityQueue则在多线程下载管理中确保高优先级任务优先执行。这两个数据结构提升效率,简化代码,是编程中的强大工具。
10 0
|
7天前
|
算法 搜索推荐 Java
在Java中实现高效的算法与数据结构
在Java中实现高效的算法与数据结构
|
17天前
|
存储 算法 调度
算法与数据结构-栈篇
算法与数据结构-栈篇
14 0
|
18天前
|
人工智能 算法
程序技术好文:算法与数据结构
程序技术好文:算法与数据结构
|
19天前
|
算法 Java
Java数据结构与算法:最短路径算法
Java数据结构与算法:最短路径算法
|
20天前
|
存储 算法 搜索推荐
【数据结构和算法】--- 基于c语言排序算法的实现(2)
【数据结构和算法】--- 基于c语言排序算法的实现(2)
12 0
|
20天前
|
搜索推荐 算法 大数据
​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
|
20天前
|
搜索推荐 算法 C语言
【数据结构和算法】--- 基于c语言排序算法的实现(1)
【数据结构和算法】--- 基于c语言排序算法的实现(1)
20 0

热门文章

最新文章

  • 1
    @SneakyThrows 是 Lombok 库中的一个注解
    5
  • 2
    在会议系统工程中,Python可以用于多种任务,如网络请求(用于视频会议的连接和会议数据的传输)、数据分析(用于分析会议参与者的行为或会议效果)等。
    9
  • 3
    在可视会议系统工程中,系统工程方法可以帮助我们系统地规划、设计和实现一个高效、可靠的可视会议系统。
    10
  • 4
    我们可以从系统工程的角度来讨论如何优化组织架构,并给出一些可能涉及的Python应用领域的示例。
    7
  • 5
    在环境治理领域,污染治理系统工程旨在通过系统的方法来解决环境污染问题。这通常包括污染源的识别、污染物的监测、治理技术的选择、治理效果的评估等多个环节。
    13
  • 6
    我将提供一个简化的Python代码示例和详解,以展示如何使用Python和Django框架来构建智能化小区综合物业管理系统的一部分功能。
    8
  • 7
    在系统工程中,软件测试是一个至关重要的环节,它确保软件的质量、可靠性和性能。软件测试通常包括多个阶段,如单元测试、集成测试、系统测试和验收测试等。
    14
  • 8
    在软件部署阶段,系统工程的目标是确保软件能够顺利、稳定地部署到目标环境中,并满足用户的需求。
    11
  • 9
    航空航天领域,系统工程被用于设计复杂的飞行器和系统。这包括飞行器的结构、推进系统、控制系统等。
    12
  • 10
    在通讯系统工程中,这通常包括硬件、软件、网络协议、数据传输等多个方面的设计和实现。
    9