MySQL进阶之索引
作者:兜兜转转m 发布时间:2024-01-23 11:54:09
索引概述
介绍
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引。
索引就是一种数据结构,这种结构类似,链表,树等等。但是比它们要复杂的多。
为什么要用索引呢?
假如我们有如下数据
如果我们要查询年龄=45的全部信息。
select * from tb_user where age = 45;
那么SQL是如何查询呢?
MySQL需要进行全表扫描,然后对比每条数据中的age值是否是45。
加入我们要100个数据,那你继续全表扫描找出age = 45;岂不是太麻烦了?
这是你是否想起来数据结构中二叉搜索树?我们将age的值映射到这个二叉搜索树上,那么我们就可以快速查找到我们要的结果。age 到二叉搜索树的过程就是索引。
注意:我们仅仅用二叉搜索树举例子,想信你肯定知道MySQL中的索引肯定比这个复杂。
此时我们对索引的理解更加深入了,索引仅仅是建立了一个数据结构,把数据存入到这个结构上,方便MySQL查找数据罢了。
特点
索引结构
MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种
上述是MySQL中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持 情况。
我们主要看InnoDB就可以了,因为MyISAM会被MongoDB代替,Memory会被Redis代替。
我们一般指的索引是指的是B+tree。
当然B+tree肯定不是一上来就提出来的,肯定是有一个进化的过程。
索引进化的过程
我们都知道二叉搜索树是一个方便存储的结构,因为其天然的排序。左子树都小于中间节点,右子树都大于中间节点。
但是它有什么缺点呢?在极端情况下会退化成链表。查找时间复杂度O(n),这不就等效于全表查询了?
如何克服呢?使用红黑树,因为它是一种平衡二叉树。可以避免出现链表这种极端情况。
那么是不是使用红黑树就可以了?答案:还是不行,不够理想。
为什么呢?因为是二叉树,如果MySQL中数据过多,那么将会出现树的层级过深。
我们知道数据以Page为单位存入的,在Page切换查询时会出现磁盘IO操作。层级过深就会造成IO频繁。
如何解决上述问题呢?B-Tree出场。
B-Tree
B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。 以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key(每个key都可以存放数据),5 个指针:
是不是使用b树就可以了呢?原则上是可以了,但是还有一种更优的方案B+Tree 代替了BTree。
MySQL中的B+Tree 和BTree有什么不同呢?
B+Tree只在叶子节点存储数据,从而保证每个Page中存入更多的key。
叶子节点包含了根节点和非叶子节点--图中红框显示。
叶子节点采用双向循环链表连接,方便查找。
因此我们可以回答:为什么MySQL采用B+Tree呢?
来源:https://blog.csdn.net/abc123mma/article/details/127804116
猜你喜欢
- Tkinter(即 tk interface,简称“Tk”)本质上是对 Tcl/Tk 软件包的 Py
- 这篇文章主要介绍了如何使用Python发送HTML格式的邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 本文主要介绍的关于Python切片赋值的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:昨天有同学问了我这么个问题:t = [1
- 写给新手的话pycharm是什么,为什么让我指定interpreter记事本最开始写C语言代码的时候,人们使用vi,记事本等软件写代码,写完
- 先看看那种容易被注入的SQL id = 11001 sql = """
- 利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信。首先,先了解下SocketServer模块中可供使用的类:Bas
- 为音视频自动生成字幕的 python 工具autosub 是一个能自动为音视频生成字幕的 python 包,以下为其简介和使用说明。auto
- 一个js代码,图片实时变形一幅图片,长度\宽度之大小与比例都不停地变化,如同哈哈镜的效果,很能引人注目,用在网页上,可以给人意外的惊喜!&l
- 如何用我的国际域名做虚拟域名?config.asp<%Domain_URL = "intels.net&
- 一、导入库import randomimport time二、注册用户我们用变量与input实现name = str(input('
- 一、说明 numpy.ufunc是什么函数?答
- 工作中有时候需要对vgg进行定制化处理,比如有些时候需要借助于vgg的层结构,但是需要使用的是2 channels输入,等等需求,这时候可以
- 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况
- YUI3.2.0 的 transition 模块,通过使用 transition:end 事件实现在 transition 完成后执行其他操
- 可以输入的下拉菜单,不错的一个效果,相信asp之家给大家收集的这个代码会有不少人需要!<html> <head> &
- 这篇文章主要介绍了python Jupyter运行时间实例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 最近在无忧脚本混了一阵子,回复了一些贴子,自己却没有做出什么东东让大家看看,心里有些不安,于是写了下边的一点东西,本来应该发在类封装区的,考
- OpenCVOpenCV 是计算机视觉领域最受欢迎的开源库,起初它由 C/C ++ 编写,现在用 Python 也能使用。OpenCV 可以
- 误区 #7:一个数据库可以存在多个镜像 错误 这个误区就有点老生常谈了。每一个主体服务器只允许一个镜像服务器。如果你希望存在多个主体服务器的
- python中通过虚拟化出来一个空间,与主环境完全隔离,避免项目中对于环境要求,造成的插件版本混乱(python特别吃环境)mac 的配置前