Mysql之索引存储原理

在介绍索引实现之前,我们先来了解下几种树的数据结构:

一、二叉搜索树

二叉搜索树有以下性质:

1.每个节点有一个关键字
2.左右孩子至多有一个。
3.关键字大于左孩子,小于右孩子。
正因为二叉搜索树的特性,所以这种数据结构很适合用来做搜索,效率等同于二分查找,时间复杂度为log2(n),

在这里插入图片描述

但是这种最原始的二叉树有一个弊端,在极端的情况下会退化成链表

在这里插入图片描述
所以基础二叉搜索树有很多变种,例如红黑树和AVL树,基于特定的策略避免了树退化成链表,红黑树做数据量不大的搜索还是应用很广泛的,但是要基于文件索引系统。却不合适,因为红黑树虽然搜索效率高,但是树的高度比B-树和B+树要高,需要进行的磁盘IO就多,相比之下后者优势就比较明显了。

2.B-树

B-树是一种多路搜索树,不是二叉树

我们来看一个m阶B树,它有如下几个性质:
1.根节点至少有2个孩子,根节点孩子数为[2,m]。
2.除根节点外每个非叶子节点的孩子数为[m/2,m](向上取整)。
3.非叶子节点的关键字个数=指向孩子的指针树-1。
4.所有叶子节点在同一层且关键字个数为k-1, 其中 m/2 <= k <= m
5.节点之间关键字的大小,类比二叉搜索树,即关键字的值按大小排列,pi的关键字的值属于(k[i],k[i+1])开区间,例如 p2的关键字要大于17,小于35。

图片来自网络

B树相对与二叉搜索树来说,变得矮胖,这样能减少io读取的次数,其搜索效率也是log2(n)但这还不足以用来做文件索引。因为B树有可能在非叶子节点命中数据,耗费存贮。所以文件索引一般用B+树。

3.B+树

B+树建立在B-树的基础之上,更改了几条性质
1.非叶子节点的关键字和孩子指针数相同
2.pi的关键字的值属于[k[i],k[i+1]]闭区间。
3.为叶子节点添加一个指针
图片来自网络
在这里插入图片描述

B+树在B-树的基础上添加了叶子链表指针,方便查找相邻的数据。
所有数据只有在叶子节点才会被命中,非叶子节点只提供索引,这样非叶子节点可以存贮更多的数据,索引B+树很适合做文件索引,

4.Mysql的B+索引实现原理

mysql存贮索引的文件以页为单位,一个节点相当于一页。不同的存贮引擎,索引实现也不同,就以innodb来说,默认一个索引页为16K,mysql在查询索引时,会预先把多个页加载到内存中,所以如果索引的键很大的话,会引起索引的列表,产生很多的碎片,因为如果一页存储不下一个节点的话,就会新开另外一页。

4.1索引查找模拟

首先我们看下mysql索引能存贮多少数据,
一页为16K,
1.我们假设以int(4B)大小的自增主键,一个子节点指针为6B
2.行数据大小假设为1KB
第一层:根节点
161024/(4+6)≈1638个索引键
第二层:非叶子节点
如果第二层也只存索引键,16381638≈2683044,能存200多万个索引键。
第三层如果只存数据:一页能存16行数据
1638163816=42928704,
三次io能查询4000多万数据,这就是为什么数据库为什么采取B+索引的原因,因为能减少IO的读取次数。

InnoDB使用的是聚簇索引,即数据文件就是索引文件,这里又分主键索引和非主键索引。
主键索引(聚集索引):将主键映射到B+树中,而叶子节点就是行数据。
非主键索引(非聚集索引):存贮的是主键值,再通过主键的值,去搜索主键索引获得数据。

MyISM使用的是非聚簇索引:即索引文件和数据文件分开,叶子节点仅仅存贮了数据文件的地址。这点和oracle的B树索引实现类似,都是存贮了地址。myIsm的主键索引和非主键索引没什么区别,只是存贮的键值列不同,叶子节点都是存贮的数据地址。

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

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

相关文章

基于java+springboot+vue实现的游戏账号估价交易平台(文末源码+Lw+ppt)23-555

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对游戏账号估价交易的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自…

Structured Knowledge Distillation for Accurate and Efficient Object Detection

摘要 许多之前的知识蒸馏方法是为图像分类而设计的&#xff0c;在具有挑战性的任务&#xff08;如目标检测&#xff09;中失败。本文首先提出了知识蒸馏在目标检测中失败的主要原因是&#xff1a;&#xff08;1&#xff09;前景和背景之间不平衡&#xff1a;(2)缺乏对不同像素…

PTA L2-027 名人堂与代金券

对于在中国大学MOOC&#xff08;http://www.icourse163.org/ &#xff09;学习“数据结构”课程的学生&#xff0c;想要获得一张合格证书&#xff0c;总评成绩必须达到 60 分及以上&#xff0c;并且有另加福利&#xff1a;总评分在 [G, 100] 区间内者&#xff0c;可以得到 50 元…

公司内部局域网怎么适用飞书?

随着数字化办公的普及&#xff0c;企业对于内部沟通和文件传输的需求日益增长。飞书作为一款集成了即时通讯、云文档、日程管理、视频会议等多种功能的智能协作平台&#xff0c;已经成为许多企业提高工作效率的首选工具。本文将详细介绍如何在公司内部局域网中应用飞书&#xf…

【机器学习之---统计】统计学基础概念

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 统计学基础 1. 频率派 频率学派&#xff08;传统学派&#xff09;认为样本信息来自总体&#xff0c;通过对样本信息的研究可以合理地推断和估计总体信息…

docker 的八大技术架构(图解)

docker 的八大技术架构 单机架构 概念&#xff1a; 应用服务和数据库服务公用一台服务器 出现背景&#xff1a; 出现在互联网早期&#xff0c;访问量比较小&#xff0c;单机足以满足需求 架构优缺点&#xff1a; 优点&#xff1a;部署简单&#xff0c;成本低 缺点&#xff1…

单片机基础知识

目录 微型计算机基本结构 总线 片内总线和片外总线 数据总线地址总线与控制总线 系统总线和IO总线 微处理器的内部结构 内部寄存器 通用寄存器 指针和变址寄存器 段寄存器 控制寄存器 标志寄存器 存储器的基本结构 存储器的分类 IO接口的功能 外部设备与CPU之间…

点餐小程序php毕设项目

主要技术框架&#xff1a; 主要功能模块&#xff1a; 商品管理 订单管理 用户管理 优惠券管理 商品分类管理 评论管理 轮播图管理 截图 获取源码 https://blog.lusz.top/article?article_id-2

python爬虫之xpath+多进程爬取百度贴吧实战

文章目录 抓取百度贴吧的某一个帖子的评论内容前言先查看贴吧的robots.txt页面结构分析评论者头像&#xff0c;用户抓取评论内容的抓取评论下回复内容的抓取 源码实现贴吧抓取过程源码实现多进程的实现 抓取百度贴吧的某一个帖子的评论内容 前言 本项目实战是用来学习用&#…

操作系统内功篇:硬件结构之CPU是如何执行任务的?

一 CPU是如何读写数据的&#xff1f; 1.1 CPU架构(组成) 当代CPU一般是多核心的&#xff0c;每个核心都有自己的一个L1和L2Cache&#xff0c;L3Cache是一个CPU所有核心共享的&#xff0c;一个CPU只有一个。L1Cache分为数据缓存和指令缓存。 CPU有三层高速缓存的目的就是将Cac…

安装paddle detection心得

一、安装PaddlePaddle conda create -n mypaddle python3.8 conda activate mypaddle python -m pip install paddlepaddle-gpu2.6.0 -i https://mirror.baidu.com/pypi/simple 请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。 这是CUDA1…

Warning logs 2024-03-23

给旧的笔记本安装ubuntu系统&#xff0c;并实现ssh远程连接 1、下载ubuntu系统 ubuntu下载链接 选择带桌面版本 2、准备U盘 3、使用UltraISO制作启动盘 破解UltraISO软件 输入 注册名&#xff1a;王涛 注册码&#xff1a;7C81-1689-4046-626F 使用UltraISO&#xff0c…

RabbitMQ的使用—实战

RabbitMQ的使用—实战 ​ RabbitMQ是一个开源的消息代理中间件&#xff0c;在分布式系统开发中被广泛应用。它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c;提供可靠的消息传递、灵活的路由、消息确认等功能。下面是使用RabbitMQ的基本流程&#xff1a; 安…

雷卯推荐超级省电防反接方案

方案特别适合一端电池&#xff0c;一端充电的防反接&#xff0c;特别节能 低VF肖特基电源防反接 此方案采用3颗低压降SKY&#xff0c;相比只用1颗功耗更低&#xff0c;可以防止元器件过热 &#xff08;两者正常工作损耗对比公式&#xff1a; 1.采用1颗SS34LVFA&#xff1a;…

如何安装配置Goland并使用固定公网地址SSH远程连接本地服务器

文章目录 1. 安装配置GoLand2. 服务器开启SSH服务3. GoLand本地服务器远程连接测试4. 安装cpolar内网穿透远程访问服务器端4.1 服务器端安装cpolar4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 本文主要介绍使用GoLand通过SSH远程连接服务器&#xff0c;并结合cpolar内…

八、C#计数排序算法

简介 计数排序是一种非比较性的排序算法&#xff0c;适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数&#xff0c;然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。 创建一个长度为max-min1的数组count…

IM系统设计之websocket消息转发

Websocket消息转发 项目地址&#xff1a;gitgithub.com:muyixiaoxi/Link.git 上周面试被面试官问到&#xff1a;“在分布式IM系统中&#xff0c;如何实现多个websocket集群之间的通信”。 我在思考了良久后回答&#xff1a;“不会”。 随着我的回答&#xff0c;我和面试官的…

【机器学习入门 】支持向量机

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 前言 支持向量机(Support Vector Machine) 于1995年发表&#xff0c;由于其优越的性能和广泛的适用性&#xff0c;成为机器学习的主流技术&…

阿里云有免费服务器吗?有的,附送免费服务器申请流程

阿里云服务器免费试用申请链接入口&#xff1a;aliyunfuwuqi.com/go/free 阿里云个人用户和企业用户均可申请免费试用&#xff0c;最高可以免费使用3个月&#xff0c;阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置&#xff1a; 阿里云免费服务器领取 阿里…

day10_面向对象之封装丶构造器

封装概述 现实生活中&#xff0c;每一个个体与个体之间是有边界的&#xff0c;每一个团体与团体之间是有边界的&#xff0c;而同一个个体、团体内部的信息是互通的&#xff0c;只是对外有所隐瞒。 面向对象编程语言是对客观世界的模拟&#xff0c;客观世界里每一个事物的内部…