【MySQL】深入了解索引背后的内部结构
时间:2025-06-24 12:02:23 来源:新华社
【字体:  

目录。

理解索引:

功能:

使用索引:

数据结构࿱在索引的底部a;

哈希表。

AVL树。

红黑树。

b树:

B+树:

B+树木搜索:


理解索引:

在数据库中,索引是数据结构,用于加快查询操作。

功能:

  • 表、数据和索引在数据库中的关系,与书架上的书籍、书籍内容和书籍目录相似。
  • 索引的作用类似于书籍目录,可用于快速定位、检索数据。
  • 索引对提高数据库性能有很大帮助。

例如,字典󿀌如果一一搜索,这种效率会很低。

但是如果给它贴上标签,,你可以找到你想搜索的东西,所有它。大大提高了我们的查询速度。

索引可以提高查询速度,但是,增删和删除的速度可能会减慢,后续增删数据的操作,都需要同步索引。但在实际开发中,查询频率远高于增删改操作,所以利大于弊。


使用索引:

///查看索引show index from 表名;///创建索引//非主键、非唯一约束、非外键字段,可以创建普通索引createe index 索引名 on 表名(字段名);///删除索引dropp index 索引名 on 表名;

 操作:

注意:。

   。    创建索引也是一个危险的操作!!!
在空表或数据量相对较小的表中创建索引没有问题,但是,如果表中的数据很大,此时,创建索引将导消耗大量CPU/硬盘IO,MySQL可以直接挂起;

        方法:

1.预测哪些索引可能会频繁使用,根据建议�提前创建。
2.引入新的数据库服务器,提取创建索引#xff0c;将旧数据库服务器数据慢慢导入新服务器(常规做法);

索引底层的数据结构:

索引必须引入一些额外的数据结构,加快查询速度!

引入索引的目的,通过其他数据结构,加快查询速度,为了减少表的遍历!


那么哪些数据结构可以加快查询速度?

        。1.顺序表: 随机访问,插入删除效率低 不适合加快查询速度。

        2.链表:从头到尾遍历󿀌更不能加快查询速度。

        。3.哈希表 。

哈希表。

    众所周知,#xff0c;查询哈希表最快的,构建合适的哈希函数,即使在极端情况下࿰,也能达到O(1)查询速度c;通过哈希函数将所有值映射到同一个哈希桶上󿀌达到O(N),理论上,这种情况只存在于,现实中几乎不可能出现。最坏的情况下󿀌哈希桶上的每个链表长度为M,O(M)也是近视O(1)。      。

    虽然哈希表的查询速度特别快,但它只能找到特定的值(key),不是一系列范围,但是,当我们在数据库中找到它时,它是一系列的范围数据,因此,不适合数据库查询;

        4.树。

二叉搜索树的数据 中序遍历是连续范围内的数据 有序,可进行范围查询󿀌假如是一棵相对平衡的二叉树搜索树 遍历速度O(logN)  在最坏的情况下,成为链表,就会变成O(N)速度。

AVL树。

是一棵严格的二叉搜索树,子树高度不得超过1 所以遍历速度O(logN)  但是当你非常严格的时候,每次增删操作,从而触发旋转操作󿀌每次旋转�都会有开销。

红黑树。

红黑树没有AVL树那么严格,触发旋转的概率很小,虽然没有AVL树平衡,但查询速度也没有太大差别。

红黑树中的数据 中序遍历是连续范围内的数据 有序,可进行范围查询󿀌但是因为是二叉型࿰,所以是二叉型c;如果数据量特别大󿀌这将使树的高度非常高,每加一层࿰树的高度c;比较次数会增加一次,因为数据保存在硬盘中,会有更多的硬盘IO操作,它的查询效率会变慢,因此不适合大规模数据。


 。因此,引入了B树,它是N叉搜索树,相同数量的数据,所需节点减少,树的高度大大降低了,从而减少了遍历的次数。

B树:

以上是B树的大致形状。

1.每个节点上的key有序,比较时可以直接用二分搜索。

2.B树将控制每个节点上的key数量,如果key太多࿰,c;它会分裂出更多的叶节点。

3.多个数据󿀌都放在连续的存储空间上,比较时,使用一次IO就可以遍历整个节点。 。所以B树更适合这个数据量的范围搜索,但数据库索引的最终形式是。B+树。,B树升级版。


B+树:

B+树也是N叉树。 。对比B树 B+进一步优化了树木。

1.B+每个父节点的元素都会出现在子节点的最大值。

2.。 B树的每个节点都包含键值(Key)以及相应的值(Value)(包括。叶节点和非叶节点。)。而。B+树非叶节点。只存储。键值(Key)也就是说,ID�叶子节点。存储所有数据,而且每个叶节点都是以。链表结构。存储,B+树叶节点可以通过简单的顺序访问。高效实施范围查询。

3.每次查询操作,都会落到最后一个叶节点,硬盘IO每次都是。稳定(在计算机中稳定地做一件事是非常重要的;

4. B+存储在树非叶节点的数据相对较小,所有可以存储在内存中的,进一步减少硬盘IO的数量。

特性。B树。B+树。
数据存储位置。所有节点(数据存储;包括内部节点)叶节点中只存储数据。
内部节点。存储键和值。存储键(不存储数据)
叶节点链接。无链接。叶节点通过链表连接。
查询效率。适合单点查询。更适合范围查询。
性能范围查询。较差。非常高效(#xff09通过叶子节点链表;
树的高度。相对较高。较低。
使用内存/磁盘。内存和磁盘使用相对较低。更高效,能容纳更多的节点。

Mysql支持各种存储引擎,其中。InnoDB。最常用的(也是面试经常考试的内容),不同的存储引擎使用不同的索引 。

B+树木搜索:

以下是BƱ如何检索有无索引的树:

CREATE TABLE employees (    id INT PRIMARY KEY,    name VARCHAR(50),    age INT);

在这张表中,id为主键󿀌所有默认会创建索引,name和age列没有创建索引。

1)主键索引列遍历。 。

SELECT * FROM employees WHERE id = 5;

MySQL 会利用 B+ 树索引,直接从根节点开始搜索#xff00c;快速定位到 。id = 5。 叶节点,查询的时间复杂度为 O(log N)。 。

2)无索引列遍历。 。

SELECT * FROM EMPLOYEES WHERE NAME = 'zhangsan' ;

 MySQL 只能通过全表扫描找到数据,效率低,特别是当表中的数据量较大时。

3) 。有索引的列不是主键索引。

create index index_id on employees(age) ;

 。此时为age列创建索引。

select * from employees where age = 20 ;

此时,根据关于age的B+找到相应的叶子节点,但此时非主键索引的B+存储树叶节点的主键ID,所以找到ID后󿀌然后在ID主键索引的B+中;树中遍历 找到相应的叶节点,此时,叶节点正在存储我们想要找到的数据;

因此,有必要经历两次B+次;树,第一次找到主键ID�然后在B+#主键ID;找到相应的值;

总结: 。

  • 没有索引。,MySQL 只能通过全表扫描找到数据,效率低,特别是当表中的数据量较大时。
  • 使用 B+ 树索引的情况下。,MySQL 可以通过 B+ 树木搜索机制(O(log N) 复杂度)高效定位记录,大大提高了查询性能。B+ 树支持点查询和范围查询#xff0c;特别是大数据量表,优化起着非常重要的作用。

[责任编辑:百度一下]
检察日报数字报 | 正义网 |
Copyrights©最高人民检察院 All Rights Reserved.