MySQL数据存储、索引记录

行格式(每行记录)

行格式(每行记录):

  • 以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式。 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” 文章部分内容后,归纳记录一波。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Github与Gitlab

学习目标 能够使用GitHub创建远程仓库并使用能够安装部署GitLab服务器能够使用GitLab创建仓库并使用掌握CI/CD的概念掌握蓝绿部署, 滚动更新,灰度发布的概念 GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库,提供公有仓库和私有仓库,但私…

时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解

时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解 可…

【基于Python的新闻文本分类系统设计与实现】

基于Python的新闻文本分类系统设计与实现 摘要:1. 引言2. 数据获取与预处理3. 数据分析与可视化4. 文本分类模型设计与实现5. 结果与讨论6. 总结与展望结尾 摘要: 本文介绍了一种基于Python语言、Flask技术以及贝叶斯算法的新闻文本分类系统的设计与实现…

为了吃鸡苦练狙击,避免坑队友自己造一个狙击游戏!

引言 一文教会你造一个简易的狙击游戏。 说到狙击,相信大家都不陌生,无论是影视作品还是网络游戏,都经常能看到狙击枪的身影,最深刻的是它能够从百里之外,一枪爆头。 本文将介绍如何在Cocos Creator中造一个简易的狙…

基于C/C++的libcurl多协议文件传输库dll二次封装开发使用

libcurl 可能是最便携、最强大和最常用的 这个星球上的网络传输库。官方提供的示例,需要在项目中引用到libcurl-imp.lib才能使用。 这里我改造了下工程,将常用的接口导出到了libcurl.dll中方便直接在后续的工程代码中应用,下面可以看到dll常用…

RNN和LSTM学习笔记-初学者

提示: 目录 前言一、RNN介绍二、LSTM介绍总结 前言 提示: 提示: 一、RNN介绍 RNN是一种短时记忆,而LSTM是长短时记忆网络 二、LSTM介绍 总结

用python+opencv+PySimpleGUI实现了一款视频播放器

目录 前言准备工作主要思路主界面视频读取进度条拖拽 源码 前言 本篇将用python实现一个mp4播放器,可以通过windows资源管理器选择需要播放的mp4视频文件或者图片,然后提供播放条的快进回放,播放和暂停功能: 准备工作 python所…

5G工业网关视频传输应用

随着科技的不断进步,5G网络技术已经成为了当前最热门的话题之一。而其中一个引人注目的领域就是5G视频传输和5G工业网关应用。在传统网络通信中,由于带宽和延迟的限制,视频传输常常受到限制,而工业网关应用也存在着链路不稳定、数…

http正向代理测试,nginx反向代理中转正向代理服务器

有3台服务器如下: 192.168.111.201(反向代理到正向代理服务器) 192.168.111.202(正向代理服务器) 192.168.111.203(目标WEB系统) 防火墙网络策略如图所示: 1、192.168.111.200 只能访问 192.168…

主宰无双H5:WIN学习手工服务端通用视频教程及GM授权物品后台,支持三网H5玩法介绍

标题:主宰无双H5(游戏源码):WIN学习手工服务端通用视频教程及GM授权物品后台,支持三网H5玩法的百科 一、引言 随着互联网的快速发展,H5游戏逐渐成为人们休闲娱乐的重要方式。主宰无双H5游戏源码作为一款深…

深入理解LightGBM

1. LightGBM简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛&#…

初识Redis缓存,一文掌握Redis重要知识文集。

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

QWebEngineView 透明色 设置白屏闪烁的问题 已解决

在项目开发中。由于qt5.15 升级到qt6.5 不知道因为什么,QWebEngineView 加载出现白屏, 网上大神给的方案 五花八门,没有一个解决问题。 代码 旧代码QWebEngineView* pWebEngineView new QWebEngineView();//pWebEngineView->page()->…

HTML+CSS高频面试题

面试题目录 前言1.讲一下盒模型,普通盒模型和怪异盒模型有什么区别2.CSS如何实现居中3.讲一下flex弹性盒布局4.CSS常见的选择器有哪些?优先级5.长度单位px 、em、rem的区别6.position属性的值有哪些7.display属性的值有哪些,分别有什么作用8.…

ChatGPT在指尖跳舞: open-interpreter实现本地数据采集、处理一条龙

原文:ChatGPT在指尖跳舞: open-interpreter实现本地数据采集、处理一条龙 - 知乎 目录 收起 Part1 前言 Part2 Open - Interpreter 简介 Part3 安装与运行 Part4 工作场景 1获取网页内容 2 pdf 文件批量转换 3 excel 文件合并 Part5总结 参考资料 往期推…

字符设备驱动模块的编译

一. 简介 本文继上一篇文章的学习,上一篇文章学习了字符设备驱动框架的初步编写。文章地址如下: 字符设备驱动框架的编写-CSDN博客 本文对上一篇编写的驱动模块初步框架进行编译。 二. 字符设备驱动模块的编译 上一篇文章,编写了字符设备…

多分类预测 | MATLAB实现CNN-LSTM-Attention多输入分类预测

分类预测 | MATLAB实现CNN-LSTM-Attention多输入分类预测 分类效果 需要源码和数据的私信(微微有偿取哦)

swing快速入门(十二)

注释很详细,直接上代码 上一篇 新增内容 1.Box容器和BroadLayout布局管理器的结合用法 2.textArea(多行文本域) 3.Choice(下拉选择栏) 4. CheckboxGroup(多项单选选择框) 5. Checkbox&…

爬虫chrome浏览器抓包说明

chrome浏览器抓包说明 目标:掌握chrome在爬虫中的使用 1. 新建隐身窗口(无痕窗口) 作用:在打开无痕窗口的时候,第一次请求某个网站是没有携带cookie的,和代码请求一个网站一样,这样就能够尽可…

网络服务IP属地发生变化的原因有哪些?

近期,许多用户发现自己的网络服务IP属地发生了变化。原本固定的IP地址不再是静态的,而是发生了变动。这一现象引起了广大用户的关注和疑惑,对网络服务的使用和信息安全产生了影响。为了解决用户的疑虑,我们对此现象进行了深入探究…