Code前端首页关于Code前端联系我们

为什么MySQL索引可以如此大地提高查询性能?

terry 2年前 (2023-09-26) 阅读数 45 #数据库

MySQL 索引基本上是一种数据结构

首先,让我们了解如何将数据加载到计算机中。

磁盘IO和预读:

MySQL索引凭什么能让查询效率提高这么多?

我们先来说说磁盘IO。从磁盘读取数据是基于机械运动。每次读取数据都需要寻找、找到点并复制到内存步骤。

寻道时间是磁臂移动到特定磁道所需的时间,通常小于5ms;

搜索是搜索有磁道数据的点,平均时间为半转时间,如果是7200转盘,则搜索一个点的平均时间为600000/7200/2 =4.17女士;将

复制到内存的时间非常快,与前两次相比可以忽略不计。 ,所以IO的平均时间约为9ms。听起来很快,但数据库中数百万条数据的遍历时间却需要9000秒,这显然是灾难级别的。 MySQL索引凭什么能让查询效率提高这么多?MySQL索引凭什么能让查询效率提高这么多?

由于磁盘IO是一项非常昂贵的操作,因此计算机的操作系统具有优化的预读功能。当进行IO时,不仅保存当前磁盘地址的数据,还保存相邻的数据。它们都被读入内存缓冲区,因为当计算机访问该地址的数据时,相邻的数据也被快速访问。

IO每次读取的数据称为一页。每页数据的具体大小取决于操作系统。一般是4k或者8k。这意味着当我们读取页面上的数据时,实际的IO才刚刚发生。

(突然想到刚毕业时被问到的一个问题,Java中int类型在64位操作系统上占用多少字节?最大是多少?为什么?)

然后优化我们对于数据库查询,需要 最小化磁盘 IO 操作 以显示索引。

什么是索引?

MySQL索引的官方定义是:索引是MySQL有助于高效检索数据的数据结构。

MySQL 中常用的索引在物理上分为两类,B树索引和哈希索引。

这次我们主要说的是索引BTree

BTree索引

BTree也称为多路平衡搜索树。 m 分裂 BTree 的特征如下:

  • 树中的每个节点最多包含 m 个子节点。
  • 除根节点和叶节点外,每个节点至少有 [ceil(m/2)] 个子节点(ceil() 进行四舍五入)。
  • 如果根节点不是叶节点,则它至少有两个子节点。
  • 所有叶子节点都在同一层。
  • 每个非叶节点由n个键和n+1个指针组成,其中[ceil(m/2)-1]

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门