Mysql常见的索引模型

news2024/11/15 10:28:08

目录

    • 有序数组
    • 哈希表
    • 二叉搜索树
    • B-Tree
    • B+Tree

有序数组

我们指定一个列为索引,然后按照这个列的值排序,以有序数据存放入数据表中,如下所示
在这里插入图片描述
这样,我们在查找数据的时候,就可以通过id这个列,在数据表中进行二分查找,二分查找的时间复杂度为O(logn),这是非常快的

另外由于数据是有序存放的,所以支持范围查找,只要找到起始值然后往后扫描判断,就可以检索出范围内的值

但是使用有序数组的情况,如果是插入或者删除数据,就会非常的麻烦。可以想象,插入数据需要将后半部数据往后挪动一个位置,删除数据需要将后半部数据往前挪动一个位置,这样的代价是非常大的,所以这也是没有使用有序数组来组织索引的原因

哈希表

我们指定一个列为索引,然后将这个列的值作为key,将数据放到哈希表其中的一个bucket中,如下所示
在这里插入图片描述
在查找数据的时候,就可以通过id这个列作为key,在哈希表中查找,理论上哈希表的时间复杂度是O(1),所以查找数据会非常快
但是哈希表是无序的,所以我们无法利用索引进行范围查找,只能利用索引来进行等值查询

二叉搜索树

我们指定一个列为索引,然后将这个列的值作为key,来组织一棵二叉搜索树,如下所示
在这里插入图片描述
对于平衡二叉树来说,查找的时间复杂度为O(logn),所以查找速度也非常快
二叉搜索树是有序的,所以也支持范围查找
首先我们要明确的一点是,这棵树是存在于磁盘中,每次我们都要从磁盘中读取出相应的节点,然而二叉搜索树的节点在文件中是随机存放的,所以可能读取一个节点就需要一个磁盘IO,恰恰二叉搜索树都会比较高,如一棵一百万个元素的平衡二叉树就有十几层高度了,也就是大部分情况下检索一次数据就需要十几次磁盘IO,这个代价太高了,所以一般二叉搜索树也不会被用来作索引

B-Tree

B-Tree的每个节点都是一个页,可以存放多个数据节点,每页中的节点都是有序的,左子树的节点小于当前节点,右子树节点大于当前节点,InnoDB中规定一个页大小为16K,使用B-Tree作为索引如下所示
在这里插入图片描述
B-Tree的查找过程是,因为每个页中的节点都是有序的,所以在每个页中都可以使用二分查找,而B-Tree的高度又会很低,所以查找效率会很快

一个页有16k,假设平均一条数据大小为100,那么一个页就可以放160条记录,三层高度的B-Tree就可以存放400多万(160160160)条记录,四层高度就可以存放6亿多条记录,B-Tree的高度一般为3-5层。而根节点一般都是缓存在内存中的,所以一般只需要2-4次磁盘IO就可以查询到指定的数据

B+Tree

B+Tree相对于B-Tree,有两个区别

  • 非节点只存放索引key,不存放数据,数据只存在于叶子节点
  • 叶子节点页之间使用链表连接

在这里插入图片描述
因此带来的几个好处

  • B+Tree的磁盘读写代价更低:由于非叶子节点只存放索引不存放数据,所以每个节点可以存放更多的索引,一次读取查找的关键字更多,树的高度更低
  • B+Tree的查询效率更加稳定,因为只有叶子节点存在数据,所以每次查询的路径长度都是相同的
  • B+Tree更适合范围查询,因为B-Tree的非叶子节点存放数据,所以需要使用中序遍历来查询,- 而B+Tree只有叶子节点有数据,叶子节点之间使用链表连接,所以只要顺序扫描进行,更加方便
    基于上述的原因,B+Tree比B-Tree更适合做数据库索引

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里 P8 整理的《百亿级并发系统设计》实战手册,实在是太香了

面试官问:如何设计一个高并发系统? 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了。为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥有高并发经验者优先。 如果你确实有真才实学,在互…

9-《数据结构》

[TOC](9-《数据结构》 一、数组1.稀疏数组 二、链表三、队列四、栈五、树5.1 完全二叉树5.2 满二叉树:深度为k且有2^k-1个结点的二叉树称为满二叉树**5.3 二叉排序树(二叉搜索树、二叉查找树)5.4 平衡二叉树:5.5 红黑树 六、堆七、…

文件夹加密码的方法有哪些?文件夹加密方法盘点

在我们使用电脑的过程中,我们会将一些重要的数据放入文件夹内进行统一管理,为了保护数据安全,文件夹加密码通常是一个不错的选择。那么文件夹该怎么加密码呢?电脑文件夹加密码的方法有哪些呢? 文件夹加密码方法 首先…

opencv读取图片

opencv是一款非常强大的图像处理库,可以用来进行图像的处理。opencv库提供了丰富的工具,比如图像缩放,旋转,倾斜校正,自动对齐等等,使用这些工具可以很方便的进行图像的处理。那么你知道 opencv怎么读取图片…

Java学习笔记-04

目录 静态成员 mian方法 多态 抽象类 接口 内部类 成员内部类 静态内部类 方法内部类 匿名内部类 静态成员 static关键字可以修饰成员方法,成员变量被static修饰的成员,成员变量就变成了静态变量,成员方法就变成了静态方法static修…

Java流程控制(一)

⭐ 控制语句⭐ 条件判断结构(选择结构)⭐ switch 语句 做任何事情事情都要遵循一定的原则,毕竟不以规矩,不成方圆,例如,到图书馆去借书,就必须要有借书证,并且借书证不能过期,这两个条件缺一不可…

【新星计划回顾】第二篇学习计划-通过定义变量简单批量模拟数据

🏆🏆又到周末,最近这段时间非常忙,虽然导师首次参与新星计划活动已经在4月16日圆满结束,早想腾出时间来好好整理活动期间分享的知识点。 🏆🏆非常感谢大家的支持和活动期间的文章输出&#xff0…

软件测试基础(V模型W模型)

软件测试基础 1. 软件测试的生命周期 需求分析:站在用户的角度查看需求逻辑是否正确,是否符合用户的需求和行为习惯。站在开发的角度思考需求是否可以实现,或者说实现起来难度高不高测试计划:指定测试计划(包括不限于…

Linux用户和组管理

1、用户和组简介 Linux 是多用户多任务操作系统。换句话说,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。不同用户具有不问的权限,毎个用户在权限允许的范围内完成不同的任务。 用户组是具…

进攻即是最好的防御!19个练习黑客技术的在线网站

前言 进攻即是最好的防御,这句话同样适用于信息安全的世界。这里罗列了19个合法的来练习黑客技术的网站,不管你是一名开发人员、安全工程师、代码审计师、渗透测试人员,通过不断的练习才能让你成为一个优秀安全研究人员。以下网站希望能给各…

智能排班系统 【技术选型与工具版本】

技术架构图 前端工具及环境 名称版本介绍NodeJS16.13.2开源、跨平台的 JavaScript 运行时环境Npm8.1.2npm包管理工具可以快速引入别人开发好的工具包进行使用Webpack4.0.0打包工具Vue2.6.14Vue 的核心库只关注视图层,易于上手,便于与第三方库或既有项目…

每日学术速递5.17

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.HACK: Learning a Parametric Head and Neck Model for High-fidelity Animation 标题:HACK:学习用于高保真动画的参数化头颈模型 作者:Longwe…

FEC功能在40G和100G光模块中的应用和注意事项

FEC(Forward Error Correction,前向纠错)功能是一种在数字通信中用于纠正传输过程中产生的误码的技术。在100G和40G光模块中,FEC功能被广泛应用于光纤传输过程中,以提高传输的可靠性和抗干扰能力。 本期文章我们主要介…

Twitter架构决策

技术决策需要在不同限制条件下做出权衡,本文介绍了Twitter早期应对用户大规模增长所做出的技术架构决策。原文:Twitter’s Tough Architectural Decision[1] Jeremy BezangerUnsplash 研究大规模互联网应用可以学到很多东西,像Netflix这样的公…

强大而可靠的DiskQ:持久化队列的解决方案

强大而可靠的DiskQ:持久化队列的解决方案 简介: 在软件开发中,处理大量数据和任务调度是常见的挑战。为了有效地处理这些问题,开发人员需要一种可靠的队列解决方案,以确保数据和任务在处理过程中不会丢失。DiskQ作为一种持久化队…

浏览器如果免费安装ChatGPT插件?

一、什么是ChatGPT? ​ ChatGPT是一种基于自然语言处理的机器学习算法,通过大规模的训练数据和优化算法来生成自然语言响应。目前,它在聊天机器人,自动回答问题,自动文本生成等方面有广泛的应用。ChatGPT是由OpenAI公…

[组合数学] 排列组合

文章目录 加法法则 --每一类都能够独立的完成任务乘法法则 --集合论 任务分步骤1000和9999之间有多个具有不同数位的奇数n 7 3 1 1 2 1 3 4 ^311^213^4 3112134 求除尽n的整数个数0到10000之间有多少个整数恰好是有一位数字是5两位数字可以组成多少两位互异且非零的两位数 减…

suricata中command的实现分析和自定义命令方法

suricata提供了suricatasc这个工具用来与其进行通信,比如修改规则文件后,通知suricata重新加载规则,就可以通过suricatasc下发重新加载规则命令,suricatasc和suricata通过unix socket进行通信,unix socke好处就是不占用…

libevent高并发网络编程 - 06_基于libevent的C++线程池实现

文章目录 1 功能简介线程池的初始化线程池执行流程 2 线程池类的设计线程类XThreadXThread.hXThread.cpp 线程池类XThreadPoolXThreadPool.hXThreadPool.cpp 任务基类taskXTask.h 3 自定义任务的例子自定义任务类ServerCMDServerCMD.hServerCMD.cpp 测试程序运行效果 1 功能简介…

华为机试(JAVA)真题Od【A卷+B卷】2023

目录 华为OD机试是什么?华为OD面试流程?华为OD机试通过率高吗?华为OD薪资待遇?华为OD晋升空间? 大家好,我是哪吒。 本专栏包含了最新最全的华为OD机试真题,有详细的分析和Java代码解答。已帮助…