MySQL 页、页结构、页目录、索引

news2024/11/19 17:30:56

MySQL中,数据存到了什么地方?

存储到了硬盘的文件上,被称为:数据文件表空间
每个数据库都是由 一组数据文件 组成,这些文件包含了:所有表、索引、其他相关对象的数据

MySQL 以什么样的方式访问?

MySQL 通过 存储引擎 来访问数据文件

什么是存储引擎?

存储引擎是一种插件式架构,定义了数据如何被存储、管理、检索

  • Innodb:支持事务
  • MylSAM:不支持事务,但执行快速

插件式架构是什么?

插件式架构(Plugin Architecture)是一种软件设计模式,它允许在不改变主程序结构的情况下,扩展和定制软件功能

使用插件式架构,用户可以在软件中添加新的功能模块替换现有的模块,而无需修改主程序代码,从而提高了软件的灵活性、可维护性和可扩展性。

通常,插件式架构的基本思想是将软件划分成核心部分插件部分两个部分

核心部分:负责提供基本的框架和服务
插件部分:为核心部分提供额外的功能改善现有功能

插件部分通过接口和API与核心部分进行交互,从而实现了增强软件功能的目的

插件式架构广泛应用于各种软件系统中,例如:

  • Web浏览器:用户可以安装不同的插件,如Flash、Java、广告拦截等,以实现特定的功能和定制化
  • 文本编辑器:用户可以安装不同的插件,如自动补全、语法高亮显示、版本管理等,以提高开发效率
  • 图形图像处理软件:用户可以安装不同的插件,如滤镜、图层、调色等,以改善图像处理质量

插件式架构是一种强大的软件设计模式,可以使软件具有更高的灵活性、可扩展性和可维护性

页:从表中获取记录的基本单位

磁盘可实现数据的持久化
但是,真正处理数据的过程,发生在内存上,所以需要将磁盘上的数据加载到内存中
磁盘读写速度非常慢,若想从表中获取记录,但交互的单位是一条条记录,会导致读取速度非常慢

InnoDB 采取的方式:将数据划分为多个页,以页作为与磁盘交互的基本单位
页大小,默认 16 KB,即一次最少从磁盘读取 16 KB 内容

在这里插入图片描述

InnoDB 行格式

在这里插入图片描述

CREATE TABLE my_table (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  age INT NOT NULL,
	sex TINYINT(4) DEFAULT 0,
	phone VARCHAR(20),
	address VARCHAR(100),
  PRIMARY KEY (id)
);


INSERT INTO my_table 
( id, name, age, sex, phone, address )
VALUES ( 1, 'zhangsan', 18, 0, '131', '上海市' );

页结构

从数据文件中,返回的数据页,可以被划分成多个不同的部分,比如

  • User Records:用户记录
  • Free Space:空闲记录

当插入一条新记录时,会从 Free Space 申请一个记录大小的空间,划分到 User Records 中去

INSERT INTO page_demo 
VALUES(1, 100, 'aaaa'), (2, 200, 'bbbb'), (3, 300, 'cccc'), (4, 400, 'dddd');

在这里插入图片描述

  • heap_no:当前记录,在页中的,相对位置
  • record_type:当前记录的类型(0 普通记录、2 Infimum 记录、3 Supremum 记录)
  • next_record:当前记录的真实数据,到下一条记录的真实数据

比如 32 表示:从当前记录的真实数据地址开始,向后找 32 字节,便是下一条记录的真实数据
0 表示无下一条记录
负数表示:向前寻找

  • n_owned:“殿后的带头大哥”所记录的,所有组中的,所有记录的条数

比如

  • Infimumn_owned 为 1,表示:以 Infimum 记录为最后一个节点,这个分组只有 1 条记录(它自己)
  • Supremumn_owned 为 5,表示:以 Supremum 记录为最后一个节点,这个分组有 5 条记录(自己 + 插入的 4 条记录)

Infimum记录所在的分组,只能有 1 条记录
Supremum记录所在的分组,只能有 1 ~ 8 条记录
剩下的分组,条数范围:只能是 4 ~ 8 条记录

MySQL,会自动在每个页中,添加 2 条记录,可以被称为虚拟记录

  • 最小记录:Infimum
  • 最大记录:Supremum

在这里插入图片描述

页目录是什么?

一种数据结构,可以

  • 存储数据页位置信息
  • 管理碎片空间

通过页目录可以快速定位到某个数据页,并知道该页中哪些空间是可用的

一个组,对应一个槽,槽中存放每个组中,最大的那条记录,在页面中的地址偏移量

在这里插入图片描述
槽,所指的记录,对应的主键值大小排序:从小到大,因此可以用二分查找

通过二分,寻找主键值为 6 的记录

e n d − s t a r t = 4 − 0 = 4 中间槽的位置 = s t a r t + e n d 2 = 0 + 4 2 = 2   槽 2 所指的记录,主键值为  8 ∵ 8 > 6 ,后面多了, e n d  缩小 ∴ e n d = 2 end -start = 4 - 0 = 4 \\ 中间槽的位置 = \frac{start + end}{2} = \frac{0 + 4}{2} = 2 \\ ~ \\ 槽2所指的记录,主键值为 ~ 8 \\ \because 8 > 6,后面多了,end ~ 缩小 \\ \therefore end = 2 endstart=40=4中间槽的位置=2start+end=20+4=2 2所指的记录,主键值为 88>6,后面多了,end 缩小end=2


e n d − s t a r t = 2 − 0 = 2 中间槽的位置 = s t a r t + e n d 2 = 0 + 2 2 = 1   槽 1 所指的记录,主键值为  4 ∵ 4 < 6 ,前面多了, s t a r t  变大 ∴ s t a r t = 1 end -start = 2 - 0 = 2 \\ 中间槽的位置 = \frac{start + end}{2} = \frac{0 + 2}{2} = 1 \\ ~ \\ 槽1所指的记录,主键值为 ~ 4 \\ \because 4 < 6,前面多了,start ~ 变大 \\ \therefore start = 1 endstart=20=2中间槽的位置=2start+end=20+2=1 1所指的记录,主键值为 44<6,前面多了,start 变大start=1


因为:
e n d − s t a r t = 2 − 1 = 1 end -start = 2 - 1 = 1 endstart=21=1
只相差 1 位
因此,如果主键值为 6 的记录,在表中存在
则一定在槽 1 开始,槽 2 结束的位置之间
从 槽1 开始的位置,依次遍历,即可找到主键值为 6 的记录

目录项的由来

一个页中的数据存储有限,若想存储更多数据,就需要更多的页
如何从众多页中,快速获取所需主键值的记录?给每个页,建立一个目录项
目录项包含两个部分:

  • key:记录当前页中,最小的主键值
  • page_no:页号,通过页号,可定位到对应页

在多个页中,查找主键值为 20 的记录

  1. 先到存储目录项记录的页中,根据二分,找到 12 < 20 < 209,定位到页 9 (一个例子)
  2. 在页 9 中,根据二分,获取对应记录

可以为存储目录项记录的页,生成一个更高级的目录项记录(套娃)
假设每个页可以存放 100 条数据记录,1000 条目录项记录

  • B+树有一层:最多存放 100 条数据记录
  • B+树有二层:最多存放 100 × 1000 = 100000 = 10 万 100 \times 1000 = 100000 = 10万 100×1000=100000=10 条数据记录
  • B+树有三层:最多存放 100 × 1000 × 1000 = 100000000 = 1 亿 100 \times 1000 \times 1000 = 100000000 = 1亿 100×1000×1000=100000000=1亿 条数据记录
  • B+树有四层:最多存放 100 × 1000 × 1000 × 1000 = 100000000000 = 1000 亿 100 \times 1000 \times 1000 \times 1000 = 100000000000 = 1000亿 100×1000×1000×1000=100000000000=1000亿 条数据记录

索引

索引的定义

从基本层面来看,数据库,只做两件事

  • 当插入时,它就保存数据
  • 当查询时,它会返回数据

索引:额外的元数据,帮助快速的定位想要查询的数据

它是一种,空间换取查找时间的权衡

聚簇索引

  • 使用记录的主键值大小,进行记录和页的排序
  • B+树叶子节点,存储完整的用户记录(这个记录,存储了所有的列的值)

每个表只能有一个聚簇索引,因为每个表只能按照一种排序方式来存储数据
通常情况下,聚簇索引会针对主键列进行创建,这样可以保证主键唯一性,并且可以根据主键值来快速查找、排序和分组数据。

与非聚簇索引不同,聚簇索引不仅包含了索引值,还包含了整个数据行的信息
因此,在使用聚簇索引查询时,如果需要扫描多个行,则需要读取多次磁盘操作,这可能会影响查询效率。
但是由于聚簇索引将具有相似键值的行存储在一起,因此对于特定范围的查询,聚簇索引比非聚簇索引更高效。

InnoDB存储引擎,会自动创建聚簇索引

没有索引的查找

  • 如果查找条件为主键,则可通过页目录,使用二分,快速定位到槽
  • 如果查找条件为非主键,需从头到尾的遍历,直到找到对应记录

非主键的查找条件,在页中的记录,没有规律,因此需全量遍历

针对非主键的搜索条件,能否有一种高效的查询方式? 二级索引
我们可以多建几颗 B+ 树,不同 B+ 树中的数据,采用不同的排序规则

二级索引

相对于聚簇索引而言,二级索引并不会直接影响到数据行的物理存储位置,而是将索引值映射到具体的记录行

因此,在使用二级索引查询时,需要先根据二级索引找到匹配的记录行,然后通过主键或聚簇索引查找对应的数据

由于二级索引不需要按照特定顺序组织数据,因此通常比聚簇索引更容易创建和更加灵活
但是相对于聚簇索引而言,二级索引的查询效率可能会更低,特别是在需要扫描大量记录时
因此,在设计和使用二级索引时需要特别注意优化查询语句,避免对性能造成过大的影响

参考:《MySQL 是怎样运行的》第四章、第五章、第六章

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

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

相关文章

安卓联发科MT6737手机开发核心板 开发模块

MT6737核心板是一款基于联发科MT6737T平台高性能、可运行安卓操作系统的4G智能模块。它支持多种制式&#xff0c;包括LTE-FDD/LTE-TDD/WCDMA/TD-SCDMA/EVDO/CDMA/GSM等。此外&#xff0c;它还支持WiFi 802.11a/b/g/n和BT4.0LE近距离无线通信&#xff0c;并支持GPS/GLONASS/北斗…

机器学习笔记之计算学习理论(二)PAC学习

机器学习笔记之计算学习理论——PAC学习 引言回顾&#xff1a;霍夫丁不等式霍夫丁不等式的问题及其优化 PAC \text{PAC} PAC引出新问题——霍夫丁不等式无法通过直接比较获取最优假设函数问题的解决方法新方法对于霍夫丁不等式的约束证明 总结 引言 上一节从霍夫丁不等式为切入…

STC32G12K128单片机的 moubus-rtu 从机测试工程

简介 STC32G12K128 是STC 推出的一款32位的 C251 的单片机。最近拿到一块官方申请的 屠龙刀-STC32G开发板&#xff0c;就用它的提供的库函数&#xff0c;查考安富莱提供的 modbus 例程移植了一个 modbus-rtu 从站的工程。 modbus-rtu slave 移植注意点 modbus-rtu 功能配置 …

每日学术速递5.3

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Learning Locally Editable Virtual Humans 标题&#xff1a;学习本地可编辑虚拟人 作者&#xff1a;Hsuan-I Ho, Lixin Xue, Jie Song, Otmar Hilliges 文章链接&#xff1a;htt…

【分享】7-Zip解压缩软件的超详细使用攻略

常用的解压缩软件&#xff0c;除了WinRAR之外&#xff0c;7-Zip也是不错的选择。 7-Zip不仅是一款完全免费的开源解压软件&#xff0c;它的解压缩功能也很强大&#xff0c;可以支持视频、文档、文件夹、图片等文件进行压缩操作。 今天小编就来分享一下&#xff0c;7-Zip解压缩…

python一键登录srun校园网(以深圳技术大学为例)

全世界最&#xff08;不&#xff09;好的目录 一、需求分析二、实现过程2.1 分析api2.1.1 连接到校园网&#xff0c;自动弹出登录认证界面2.1.2 先输入错误的账号密码&#xff0c;按F12看会获取哪些信息2.1.3 api 2.2 分析加密2.3 流程总结 三.模拟登录3.1 编写配置文件3.2.功能…

【微软Bing王炸更新】无需等待,人人可用,答案图文并茂,太牛了

&#x1f680; AI破局先行者 &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#x1f3c6;&am…

opencv实践项目-图像拼接

目录 1.简介2. 步骤2.1 特征检测与提取2.2 关键点检测2.3 关键点和描述符2.4 特征匹配2.5 比率测试2.6 估计单应性 3. 完整代码 1.简介 图像拼接是计算机视觉中最成功的应用之一。如今&#xff0c;很难找到不包含此功能的手机或图像处理API。在本 文中&#xff0c;我们将讨论如…

虹科分享 | 专为创意专业人士设计的Thunderbolt适配器

一、方案介绍 虹科HK-ATTO ThunderLink雷电™ 适配器可以适用于任何地方。 1.小。 2.便携式。 3.强大。 我们的10GBE Thunderbolt适配器的性能至少比内置或附加NIC&#xff08;包括Mac&#xff09;高20% , ATTO 360只需点击一个按钮即可优化以太网SAN&#xff0c;并可与Thunder…

xxl-job 使用示例

目录 介绍 下载源码地址 文档网站 源码导入就是这样目录 数据库建表sql 就这么几个表出来了 修改xxl-job-admin项目下的application.properties文件 完事启动就行了 页面 页面访问地址 账号密码 增加自己的定时任务 介绍 这篇写的是接入使用xxl-job 的一个简单流程…

win系统使用macOS系统

最近 win 系统和 ubuntu 系统用的久了&#xff0c;想用一下 MacOS 系统&#xff0c;于是去网上查了相关资料&#xff0c;发现用一款叫 NEXUS 的软件可以实现在 windows 系统体验效果&#xff0c;现把教程记录下来&#xff0c;供大家使用。 目录 一、下载NEXUS 二、 安装NEXU…

IMX6ULL裸机篇之串口实验说明一

一. 串口 本章我们就来学习如何驱动 I.MX6U 上的串口&#xff0c;并使用串口和电脑进行通信。 串行接口指的是数据一个一个的顺序传输&#xff0c;通信线路简单。 UART 作为串口的一种&#xff0c;其工作原理也是将数据一位一位的进行传输&#xff0c;发送和接收各用一 条…

win11本地安全机构保护已关闭怎么办?如何修复windows11本地安全机构保护已关闭?

win11本地安全机构保护已关闭怎么办&#xff1f; 如何修复windows11本地安全机构保护已关闭&#xff1f; 近日有windows11系统用户反映说遇到了这样一个问题&#xff1a;启动电脑后&#xff0c;发现windows右下角的安全中心图标上会显示一个黄色叹号&#xff0c;打开windows安…

操作系统笔记--进程与线程

1--进程 1-1--进程的定义 进程表示一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程&#xff1b; 1-2--进程的组成 一个进程由以下部分组成&#xff1a;① 程序的代码&#xff1b; ② 程序处理的数据&#xff1b;③ 程序计数器中的值&#xff0c;其指示下一条将…

PHP流行框架的报错页面,你见过那些?

在PHP开发过程中&#xff0c;使用框架能够帮助我们更快速、高效地完成项目开发。但是&#xff0c;即使使用了框架&#xff0c;我们还是难免会遇到各种报错。而当我们在开发阶段或调试过程中遇到报错时&#xff0c;框架提供的错误页面可以给我们带来很大的帮助。PHP常用的流行框…

网易一面:如何设计线程池?请手写一个简单线程池?

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易的面试资格&#xff0c;遇到了几个很重要的面试题&#xff1a; 如何设计线程池&#xff1f; 与之类似的、其他小伙伴遇到过的问题还有&#xff1a; …

Reinhart FoodService的EDI需求详解

Reinhart FoodService是一家成立于1972年的美国食品服务公司&#xff0c;隶属于上市公司Performance Food Group。Reinhart FoodService为餐馆、酒店、医院、学校等各类机构提供广泛的食品选择和相关服务&#xff0c;产品包括新鲜的肉类、禽类、海鲜、奶制品、烘焙用品、蔬菜和…

迪赛智慧数——柱状图(象形动态图):不同性别消费者点外卖频率

效果图 我国超4亿人叫外卖&#xff0c;你多久点一次外卖? 据数据显示&#xff0c;30.7%男性消费者每周点3-4次外卖&#xff0c;34.3%的女性每周点3-4次&#xff0c;明显女性比男性点外卖频率多。而每周点1-2次外卖中均超过80%。 数据源&#xff1a;静态数据 { "column&…

MIT开源协议,多端适用的租房小程序,带完整的管理员后台

一、开源项目简介 多端适用的租房小程序&#xff0c;带管理员后台。是一个完整的项目&#xff0c;可以直接使用。 二、开源协议 使用MIT开源协议 三、界面展示 部分截图 1. 前台截图 2. 后台截图 四、功能概述 1、使用Uniapp开发的前台&#xff0c;基于 Vue.js 开发所有…

2 种方式在流水线中集成 DAST,动态保护应用程序安全

&#x1f4a1; 如何在流水线中集成与应用 DAST &#xff1f; 近日&#xff0c;在「DevSecOps软件安全开发实践」课程上&#xff0c;极狐(GitLab) 前端工程师钱堃、极狐(GitLab) 高级后端工程师张林杰&#xff0c;展开了关于 DAST 的概念、必要性、优缺点的内容分享&#xff0c;…