MySQL进阶之索引

作者:兜兜转转m 时间:2024-01-23 11:54:09 

索引概述

介绍

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引。

索引就是一种数据结构,这种结构类似,链表,树等等。但是比它们要复杂的多。

为什么要用索引呢?

假如我们有如下数据

MySQL进阶之索引

如果我们要查询年龄=45的全部信息。

select * from tb_user where age = 45;

那么SQL是如何查询呢?

MySQL需要进行全表扫描,然后对比每条数据中的age值是否是45。

加入我们要100个数据,那你继续全表扫描找出age = 45;岂不是太麻烦了?

这是你是否想起来数据结构中二叉搜索树?我们将age的值映射到这个二叉搜索树上,那么我们就可以快速查找到我们要的结果。age 到二叉搜索树的过程就是索引。

注意:我们仅仅用二叉搜索树举例子,想信你肯定知道MySQL中的索引肯定比这个复杂。

此时我们对索引的理解更加深入了,索引仅仅是建立了一个数据结构,把数据存入到这个结构上,方便MySQL查找数据罢了。

MySQL进阶之索引

特点

MySQL进阶之索引

索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种

MySQL进阶之索引

上述是MySQL中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持 情况。

MySQL进阶之索引

我们主要看InnoDB就可以了,因为MyISAM会被MongoDB代替,Memory会被Redis代替。

我们一般指的索引是指的是B+tree。

当然B+tree肯定不是一上来就提出来的,肯定是有一个进化的过程。

索引进化的过程

我们都知道二叉搜索树是一个方便存储的结构,因为其天然的排序。左子树都小于中间节点,右子树都大于中间节点。

MySQL进阶之索引

但是它有什么缺点呢?在极端情况下会退化成链表。查找时间复杂度O(n),这不就等效于全表查询了?

MySQL进阶之索引

如何克服呢?使用红黑树,因为它是一种平衡二叉树。可以避免出现链表这种极端情况。

MySQL进阶之索引

那么是不是使用红黑树就可以了?答案:还是不行,不够理想。

为什么呢?因为是二叉树,如果MySQL中数据过多,那么将会出现树的层级过深。

我们知道数据以Page为单位存入的,在Page切换查询时会出现磁盘IO操作。层级过深就会造成IO频繁。

如何解决上述问题呢?B-Tree出场。

B-Tree

B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。 以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key(每个key都可以存放数据),5 个指针:

MySQL进阶之索引

MySQL进阶之索引

MySQL进阶之索引

是不是使用b树就可以了呢?原则上是可以了,但是还有一种更优的方案B+Tree 代替了BTree。

MySQL中的B+Tree 和BTree有什么不同呢?

  • B+Tree只在叶子节点存储数据,从而保证每个Page中存入更多的key。

  • 叶子节点包含了根节点和非叶子节点--图中红框显示。

  • 叶子节点采用双向循环链表连接,方便查找。

MySQL进阶之索引

 因此我们可以回答:为什么MySQL采用B+Tree呢?

MySQL进阶之索引

来源:https://blog.csdn.net/abc123mma/article/details/127804116

标签:MySQL,索引
0
投稿

猜你喜欢

  • ubuntu kylin 14.10下多个mysql 5.7.14安装教程

    2024-01-24 12:50:13
  • Symfony2之session与cookie用法小结

    2023-11-22 02:58:30
  • Python详解复杂CSV文件处理方法

    2021-04-05 11:12:02
  • ASP JSON类文件的使用方法

    2011-04-30 16:39:00
  • Python实现partial改变方法默认参数

    2022-10-30 20:23:33
  • Python3 利用requests 库进行post携带账号密码请求数据的方法

    2023-04-03 05:37:53
  • python opencv调用笔记本摄像头

    2022-07-19 14:03:34
  • Python常见库matplotlib学习笔记之多个子图绘图

    2023-02-17 19:40:14
  • Python大数据用Numpy Array的原因解读

    2023-06-19 05:14:00
  • 趣味Python实战练习之自动更换桌面壁纸脚本附源码

    2021-11-03 09:12:33
  • vue循环中点击选中再点击取消(单选)的实现

    2024-05-13 09:43:50
  • 自然语言处理之文本热词提取(含有《源码》和《数据》)

    2021-11-26 11:14:58
  • python能做哪些生活有趣的事情

    2023-05-07 01:50:43
  • asp 多关键词搜索的简单实现方法

    2011-04-11 10:45:00
  • Python Tensor FLow简单使用方法实例详解

    2022-01-01 16:55:44
  • [ASP]利用 xmlhttp 分块上传文件

    2008-07-04 14:14:00
  • python中文编码问题小结

    2022-12-22 23:14:14
  • 关于Python中浮点数精度处理的技巧总结

    2021-12-28 15:12:53
  • 细化解析:SQL Server 2000 的各种版本

    2009-02-05 15:41:00
  • 详解Python查找谁删了你的微信

    2021-01-02 02:32:02
  • asp之家 网络编程 m.aspxhome.com