MySQL数据存储、索引记录

news2024/12/26 23:18:49

行格式(每行记录)

行格式(每行记录):

  • 以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式。 InnoDB 存储引擎4种不同类型的 行格式 ,分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行格式。
  • 组成: 记录的额外信息 和 记录的真实数据.
  • 记录的真实数据:为每条记录都添加 transaction_idroll_pointer 这两个列,但是 row_id 是可选的(没有自定义主机、Unique列时)
  • 记录的额外信息: 变长字段长度列表NULL值列表记录头信息
    • 把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表,各变长字段数据占 用的字节数按照列的顺序逆序存放。
    • Compact 行格式把这些值为 NULL 的列统一管理起来,存储到 NULL 值列表中
    • 记录头信息:
      • delete_mask 被删除的记录之所以不立即从磁盘上移除,是因为移除它们之后把其他的记录在磁盘上重新排列需要性能消耗,所以只是打一个删除标记而已,所有被删除掉的记录都会组成一个所谓的 垃圾链表 ,在这个链表中的记录占用的空间称之为所谓的 可重用空间
      • next_record 从当前记录的真实数据到下一条记录的真实数据的地址偏移量,第一条记录的 next_record 值为 32 ,意味着从第一条记录的真实数据的地址处向后找 32 个字节便是下一条记录的真实数据。1

数据页

数据页:

  • InnoDB 将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB。也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。
  • 结构:

2
3
4
4

数据页里每行记录:InnoDB始终会维护一条记录的单链表(next_record),链表中的各个节点是按照主键值由小到大的顺序连接起来的。

Page Directory 页目录:

  • 所有正常的行记录会划分几个组,最后一条记录(也就是组内最大的那条记录)的头信息中的 n_owned 属性表示该记录拥有多少条记录,将每个组的最后一条记录的地址偏移量单独提取出来按顺序存储到靠近 页 的尾部的地方。这个地方就是所谓的 Page Directory。页面目录中的这些地址偏移量被称为
    在这里插入图片描述
  • 主键查找记录:通过二分法确定该记录所在的槽,并找到该槽中主键值最小的那条记录,通过记录的 next_record 属性遍历该槽所在的组中的各个记录。

Page Header(页面头部):

  • 数据页中存储的记录的状态信息,比如本页中已经存储了多少条记录,第一条记录的地址是什么,页目录中存储了多少个槽等等。5

File Header(文件头部)

  • 这个页的编号是多少,它的上一个页、下一个页等…
  • 每个数据页的 File Header 部分都有上一个和下一个页的编号,所以所有的数据页会组成一个 双链表6

File Trailer:页完整性检查。

总: 各个数据页可以组成一个 双向链表 ,而每个数据页中的记录会按照主键值从小到大的顺序组成一个 单向链表 ,每个数据页都会为存储在它里边儿的记录生成一个页目录 ,在通过主键查找某条记录的时候可以在 页目录 中使用二分法快速定位到对应的,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。
6

索引:

索引背景:

  • 主键索引查找数据:以在 页目录 中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录
  • 普通列查找数据:因为在数据页中并没有对非主键列建立所谓的 页目录 ,所以我们无法通过二分法快速定位相应的 槽,只能从最小记录开始遍历查询,一页接一页
  • 目的:为快速定位记录所在的数据页而建立一个别的目录
    • 下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值。
    • 在对页中的记录进行增删改操作的过程中,我们必须通过一些诸如记录移动的操作来始终保证这个状态(页分裂
  • 页目录(索引) -基础概念
    • 页的用户记录中最小的主键值(key)
    • 页号(page_no)
    • record_type :0 :普通的用户记录、1 :目录项记录、2 :最小记录、3 :最大记录
    • 查找主键为20的记录时,1 5 12 209 二分法到 12,找到页9 单链表顺着找到20
      在这里插入图片描述
  • 当数据多起来后,页目录也多起来了,为快速定位 目录项记录,为目录项再 建一个页目录,形成层级
    在这里插入图片描述
    2

由↑ 此可见 由数据页 组成了一个类似 树的结构 B+树

  • 实际用户记录其实都存放在B+树的最底层的节点上,这些节点也被称为 叶子节点 或 叶节点 ,其余用来存放 目录项 的节点称为 非叶子节点 或者 内节点 ,其中 B+ 树最上边的那个节点也称为 根节点

聚簇索引:由 InnoDB 存储引擎自动创建

  • 叶子节点存储了完整的用户记录(所有列)
  • 页内的记录是按照主键的大小顺序排成一个单向链表、也是根据页中用户记录的主键大小顺序排成一个双向链表、同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表
  • 聚簇(索引即数据,数据即索引)

二级索引:普通列的索引创建。

  • 该列值+主键再建一个B+树,以该列的大小进行记录和页的排序,类似主键索引
  • 以该列值+主键 新建一个 根节点
  • 只不过叶子节点不是完整的数据记录,需要用主键回表一次,查询完整的记录,如果索引覆盖则不需要了(索引下推

联合索引:以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,组成一个新的B+树

  • c2、c3 建立联合索引,目录项记录 都由 c2 、 c3 、 页号 这三个部分组成。
  • 记录先按照 c2 列的值进行排序,如果记录的 c2 列相同,则按照 c3 列的值进行排序
  • 叶子节点由 c2、c3、主键组成,查找完整记录再回表
  • 最左匹配:idx_c2_c3_c4 建立联合索引,是先按c2值排序c2值相同再按c3排序以此类推,如果查询时不包含c2,则无法命中,无从找起啊。
    • 如果我们想使用联合索引中尽可能多的列,搜索条件中的各个列必须是联合索引中从最左边连续的列

匹配列前缀(字符列索引):

  • 字符排序时,先比较字符串的第一个字符,第一个字符小的那个字符串就比较小,两个字符串的第一个字符相同,那就再比较第二个字符,字符串的前n个字符,也就是前缀都是排好序的。
  • SELECT * FROM person_info WHERE name LIKE 'As%'; 这样查询能更好匹配索引
  • create index idx_name ON table_name (column_name(length)); 只索引字符串值的前缀的策略,部分场景适用

索引代价:

  • 空间上,每建立一个索引都要为它建立一棵 B+ 树,每一棵 B+ 树的每一个节点都是一个数据页,一个页默认会占用 16KB 的存储空间,一棵很大的 B+ 树由许多数据页组成。
  • 性能消耗上, 索引列的值从小到大的顺序排序而组成了双向链表,每次对表中的数据进行增、删、改操作时,都需要去修改各个 B+ 树索引

索引使用:

  • 多列排序时,order by c1,c2 此时有索引inx_c1_c2,会直接命中索引,直接回表取出该索引中不包含的列就好了
    • 注意查询列包含c1,不能 desc、asc混用
  • 要想使用索引进行排序操作,必须保证索引列是以单独列的形式出现,而不是修饰过的形式,类似 ORDER BY UPPER(name)
  • 分组查询时,分组顺序和B+ 树中的索引列的顺序是一致的
  • 只为用于搜索、排序或分组的列创建索引
  • 为基数大(不一致的值)列创建索引

读 “从根儿上理解MySQL” 文章部分内容后,归纳记录一波。
在这里插入图片描述

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

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

相关文章

电机的开环控制和闭环控制

目录 开环电机控制 闭环电机控制 开环到闭环转换 开环电机控制 开环控制(也称为标量控制或伏特/赫兹控制)是一种常见的电机控制方法,可用于运行任何交流电机。这是一种简单的方法,不需要来自电机的任何反馈。为了保持定子磁通恒…

软考、PMP 区别

软考 考试时间:一年两次,报名3月,8月;对应考试:5月最后一个周末,11月第一个周末 报名费:50-200元,每个城市不同北京57每科 报名网站:中国计算机技术职业资格网 考试等…

LangChain学习三:链-实战

文章目录 上一节内容:LangChain学习二:提示-实战(下半部分)学习目标:明白链是什么?有哪些?怎么用?学习内容一:介绍学习内容二:有那些学习内容三:实…

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka 1)环境准备2)准备相关 jar 包3)实现场景4)准备工作4.1.Mysql4.2.Kafka 5)Flink-Sql6)验证 1)环境…

EAM系统在地铁设备管理中的应用

在现代城市的交通系统中,地铁作为一种高效、快速、可靠的公共交通工具,扮演着至关重要的角色。为了确保地铁系统的正常运行和可靠性,地铁管理部门需要有效地管理大量的设备和设施。在这个过程中,企业资产管理(EAM&…

虚幻学习笔记13—C++静态和动态加载

一、前言 我们在蓝图中可以很方便的添加各种需要的组件,那么在C代码中要如何实现呢。在代码中分静态和动态加载,而无论静态和动态,加载的内容有资源和资源类,资源类通常为带资源的蓝图类。 二、实现 在实现静态或动态加载时&…

mybatis-plus雪花算法自动生成ID到前端后精度丢失问题

问题发生 前端接收到后端的数据出现异常,异常如下: 如图这是后端正常返回的数据, 但是点击预览时发现这个id的数据被改变了 这就导致了我通过id去修改相关数据时无法成功 问题原因 id的长度过长(19位),前…

针对网页html中插入动图gif不能循环播放只播放一次的解决方案

针对网页html中插入动图gif不能循环播放只播放一次的解决方案 原因分析解决方案 原因分析 使用图片编辑软件制作的过程中未启用“循环播放”功能,这里以Photoshop为例,演示设置GIF图片循环播放的操作流程:所需材料:PS。第一步&am…

云仓酒庄为您挑选意大利葡萄酒

作为世界产酒大国之一,意大利葡萄酒种类也是纷繁多样,赢得了众多葡萄酒爱好者的喜爱。说意大利葡萄酒地位仅次法国也不为过。那么,云仓酒庄的品牌雷盛红酒分享有没有一些挑选意大利葡萄酒的方法和技巧呢? 意大利的酒也有几千万种…

基于springboot乐器视频学习网站设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题,今天给大家介绍…

ES-脚本

脚本 简单使用 POST product/_update/2 {"script": {"source": "ctx._source.salary1" #将薪水字段的值 1} }预定义变量 POST product/_update/2 {"script": {"lang": "painless","source": "…

办公技巧:分享五个在线画图工具,值得收藏

目录 1. processon ​编辑 2. visual paradigm online 3. zen flowchart 4. draw io 5. Excalidraw 今天小编给大家分享五个在线画图工具,感兴趣的可以下载试一试! 1. processon 说流程图除了必提http://draw.io,processon也必须要有…

【深度学习】机器学习概述(一)机器学习三要素——模型、学习准则、优化算法

​ 文章目录 一、基本概念二、机器学习的三要素1. 模型a. 线性模型b. 非线性模型 2. 学习准则a. 损失函数1. 0-1损失函数2. 平方损失函数(回归问题)3. 交叉熵损失函数(Cross-Entropy Loss)4. Hinge 损失函数 b. 风险最小化准则1.…

如何在 Windows 10/11 上恢复已删除的 Word 文档

意外删除重要的 Word 文档可能会令人心碎。当文件恰好非常重要时尤其如此。关键数据的丢失可能会导致沮丧和恐慌,因为数小时的辛勤工作和有价值的信息似乎消失得无影无踪。然而,在您屈服于绝望之前,有个好消息。 有多种技术和工具可帮助您恢…

【AI美图】第04期效果图,AI人工智能无绘画,精选五组特写版美图欣赏

标题好看的照片让AI实现 也许你不相信吧,这么秀的照片居然全部是电脑合成AI妙手,一键打造,速度之快,效果之好,任谁都不愿意相信,然后在今天这一切都是现实的,现在让我们从照片的拍摄谈谈什么样的…

准备迎接超级人工智能系统,OpenAI宣布RLHF即将终结!超级对齐技术将接任RLHF,保证超级人工智能系统遵循人类的意志

本文原文来自DataLearnerAI: 准备迎接超级人工智能系统,OpenAI宣布RLHF即将终结!超级对齐技术将接任RLHF,保证超级人工智能系统遵循人类的意志 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/105170265526…

RocketMQ —消费重试

消费者出现异常,消费某条消息失败时, Apache RocketMQ 会根据消费重试策略重新投递该消息进行故障恢复。本文介绍消费重试机制的原理、版本兼容性和使用建议。 一、应用场景​ Apache RocketMQ 的消费重试主要解决的是业务处理逻辑失败导致的消费完整性…

EasyExcel读取Excel数据(含多种方式)

目录 EasyExcel简介 使用EasyExcel进行读数据 引入依赖: EasyExcel提供了两种读取模式 使用 监听器 读取模式 1.创建一个实体类 2.创建监听器 代码 使用 同步读 读取模式 1.创建一个实体类 2.代码 添加导入数据库的逻辑 其实官方文档讲得很清楚&#xff…

git 的使用

git reset详解-CSDN博客 git reset 命令详解 git revert命令详解。-CSDN博客 关于Git分支中HEAD和Master的理解 - 知乎 (zhihu.com) 一文带你精通 Git(Git 安装与使用、Git 命令精讲、项目的推送与克隆)-CSDN博客 Git 常用操作(5&#xff…

【Linux】tree命令使用

tree命令 tree命令用于以树状图列出目录的内容。 语法 tree [参数] [目录] tree 命令 -Linux手册页 bash: tree: 未找到命令... 安装tree yum -y install tree如果你系统中有安装tree 但是还是执行找不到该命令的话,那原因就是:环境变量错误&#x…