MySQL数据库页存储结构学习与了解

mysql,数据库,存储,结构,学习,了解 · 浏览次数 : 10

小编点评

**MySQL数据库存储引擎** **主要存储引擎:** * **InnoDB:** MySQL 的默认存储引擎,支持事务、行级锁、外键约束等功能。适用于需要大量update、delete操作的应用。 * **MyISAM:** 不支持事务和行级锁,但是对于需要经常进行读写操作的应用,MyISAM比InnoDB更快。MyISAM的表级锁可以更好的支持大量的并发读操作。 * **MEMORY:** 数据被存储在内存中,无法持久化,当服务器重启后,数据会被清空。适用于需要高速读写并且数据不需要长期存储的小型表。 * **BLACKHOLE:** 将所有写入操作“吞噬”,但是可以进行正常查询操作。适用于数据备份、测试等场景。 * **Archive:** 只支持Insert和Select,不支持Update和Delete,采用文件压缩方式进行数据存储。适用于短期存储历史数据的情况。 * **NDB:** 分布式存储引擎,支持事务和高可用性。适合处理海量数据和高并发场景。 **单页存储** * 每页包含两行记录,最大长度是 16KB。 * 每个页面可以存储 8126 个记录。 * 每个页面包含一个 Page Directory,用于存储页头和校验和。 **其他限制** *索引最大值不能超过 3072。 * 列长度之和不能大于 8126。 * 非严格模式下,大表的一个行列长度之和不能大于 65535。 **其他注意事项** * MySQL 8.0版本时,初始化一个 ibd 文件时默认设置 7 个数据页。 * 每个页面可以存储 26 个字节的记录。 * Page Directory 在存储开销中占 4 个字节。

正文

MySQL数据库页存储结构学习与了解


背景

MySQL总是出现奇奇怪怪的问题.
想着自己能够学习与提高一下.
最近看了很多文档.关于MySQL数据库相关的. 
想着总结和提炼一下, 希望能够给未来的工作提供一下指导. 

MySQL的存储引擎

MySQL有多种存储引擎, 主要有:
InnoDB:是MySQL的默认存储引擎。支持事务、行级锁、外键约束等功能。适用于需要大量update、delete操作的应用。
MyISAM:不支持事务和行级锁,但是对于需要经常进行读写操作的应用,MyISAM比InnoDB更快。MyISAM的表级锁可以更好的支持大量的并发读操作。
MEMORY:数据被存储在内存中,无法持久化,当服务器重启后,数据会被清空。适用于需要高速读写并且数据不需要长期存储的小型表。
BLACKHOLE:将所有写入操作“吞噬”,但是可以进行正常查询操作。适用于数据备份、测试等场景。
Archive:只支持Insert和Select,不支持Update和Delete,采用文件压缩方式进行数据存储。适用于短期存储历史数据的情况。
NDB:分布式存储引擎,支持事务和高可用性。适合处理海量数据和高并发场景。

MySQL的Innodb存储引擎相关限制

Mysql的Innodb的存储引擎时的限制其实很多. 
1. MySQL的索引最大值不能超过3072 
2. MySQL在严格模式下,表的列长度之和不能大于8126, 不然会出现错误:
    ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to 
    TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. 
3. 在非严格模式下, Mysql的大表的一个行列长度之和不能大于 65535, 但是注意, 这个长度是包含了字符集的设置在面.
    latin或者是ascii字符集可以保存65535个, gbk 就是65535/2, utf8 是 65535/3 utf8mb4 是 65535/4
4. InnoDB限制每个表的最大列数为1017列. 
5. Mysql在8.0之后单表大小不能超过64T.

关于Mysql单页存储的说明

在严格模式下, 数据也会有 38个字节的文件头.  56个字节的页头
以及最后8个字节的校验和. 
Mysql每一页里面都至少要存储两行记录, 还会有两个虚拟的最大列和最小列. 
每个占用13个字节, 合计 26个字节. 
Mysql还有一个Page Directory的空间. 一般使用4个字节(不是很确认)
所以一个16KB的页里面, 要有:
38+56+26+8+4=132字节的存储开销. 

所以一个页面里面可以存储两条记录. 那么计算方式为
(16384-132)/2 = 8126 长度

这个就是第一个数据库严格模式下限制长度的根本原因.

Mysql的行迁移

我在2020年时研究过一次行迁移. 当时的结论主要如下:
varchar 在 8099 的长度时会出现行溢出迁移的现象 将字符存储到第六个数据页
varchar 在 8098 时还是在当前数据也存储的, 而且应该是在第五个数据页存储.  
姜承尧老师 <MySQL技术内幕InnoDB存储引擎第2版> 
 mysql5.6 初始化时 是 6个数据页,大小是96KB, 
 但是mysql 8.0.21 的版本初始一个ibd文件时 是初始化7个数据页. 大小是 112KB

可以使用hexdump的方式将ibd文件导成 文本文档

create table test014 (a varchar(16000));
insert into test014 values  ((select repeat('a',8098)));
create table test015 (a varchar(16000));
insert into test015 values  ((select repeat('a',8099)));

hexdump -Cv /var/lib/mysql/zhaobsh/test014.ibd  > test014.txt
hexdump -Cv /var/lib/mysql/zhaobsh/test015.ibd  > test015.txt
然后可以查看每个ibd文件的存储. 

一些简单总结

MySQL其实不是很适用于ERP这种经常多表关联的业务需求场景
互联网经常使用的CRUD模式下性能还是比较良好的.

最近发现MySQL的多表关联视图也存在很多问题. 
感觉这个数据库的确不适应很复杂的业务逻辑场景.
如果应用能够在内存中进行计算而不是使用SQL进行处理. 那么还是比较合适的. 

与MySQL数据库页存储结构学习与了解相似的内容:

MySQL数据库页存储结构学习与了解

# MySQL数据库页存储结构学习与了解 ## 背景 ``` MySQL总是出现奇奇怪怪的问题. 想着自己能够学习与提高一下. 最近看了很多文档.关于MySQL数据库相关的. 想着总结和提炼一下, 希望能够给未来的工作提供一下指导. ``` ## MySQL的存储引擎 ``` MySQL有多种存储引

[转帖]深入理解mysql-第五章 InnoDB记录存储结构-页结构

前言: 页是InnoDB管理存储空间的基本单位,上一章我们主要分析了页中的主要的构成行的存储结构-行格式,其中简单提了一下页的概念。这章我们详细讲解一下页的存储结构。 一、数据页结构 前边我们简单提了一下页的概念,它是InnoDB管理存储空间的基本单位,一个页的大小一般是16KB。和存储一条条数据的

【转帖】MySQL InnoDB存储原理深入剖析与技术分析

一、MySQL记录存储: MySQL InnoDB的数据由B+树来组织,数据记录存储在B+树数据页(page)中,每个数据页16kb,数据页 包括页头、虚记录、记录堆、自由空间链表、未分配空间、slot区、页尾七部分组成。 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)

【转帖】《MySQL高级篇》四、索引的存储结构

1. 为什么使用索引 假如给数据使用 二叉树 这样的数据结构进行存储,如下图所示 2、索引及其优缺点 2.1 索引概述 2.2 优点 类似大学图书馆建书目索引,提高数据检索的效率,降低 数据库的 IO 成本 这也是创建索引的主要的原因。通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性 (唯一

MySQL高级10-InnoDB引擎存储架构

一、逻辑存储结构 表空间(Tablespace):一个mysql实例,及一个数据库实例,可以对应多个表空间(ibd文件),用于存储记录,索引等数据。 段(Segment):分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback

MySQL面试题全解析:准备面试所需的关键知识点和实战经验

本次种子题目主要涵盖了MySQL的存储引擎和索引结构,如B+树索引和哈希索引,以及覆盖索引和回表的概念。此外,还包含了MySQL事务的ACID特性和隔离级别。另外,对MySQL主从集群中的binlog日志的执行顺序和作用进行了讨论。最后,还涉及了分库分表和读写分离的概念。这些内容涵盖了MySQL数据库的核心知识和重要技术,不仅在面试中起到关键作用还对于优化数据库性能和应用开发都具有重要意义。

何时使用MongoDB而不是MySql

## 什么是 MySQL 和 MongoDB MySQL 和 MongoDB 是两个可用于存储和管理数据的数据库管理系统。MySQL 是一个关系数据库系统,以结构化表格格式存储数据。相比之下,MongoDB 以更灵活的格式将数据存储为 JSON 文档。两者都提供性能和可扩展性,但它们为不同的应用场景

MySQL高级6-视图

一、视图介绍 视图(View):是一种虚拟存在的表,视图中的数据并不在数据库中实际存在,行和列数据来自,定义视图时查询使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询的结果。 二、创建视图 2.1 语法 create [or replace] view 视图

GaussDB(DWS)函数不同写法引发的结果差异

GaussDB(DWS)支持多种兼容模式,为了兼容目标数据库,各模式之间或多或少存在一些行为差异。这里分享一个mysql兼容模式下的表达式函数因不同写法引发的结果差异案例。

[转帖]阿里规范 - 五、MySQL 数据库 - (一)建表规约 - 8 - 【强制】varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长 度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。

字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。 1、因为mysql 是行存储模式,所以会把整行读取出来。text 储存了大量的数据。读取时,占了大量的io。所以会十分的慢。 2、每行的数据过大 行溢出 InnoDB 会将一些大对象数据存放在数据页之外的 BLOB 页