MySQL数据库页存储结构学习与了解
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数据库的存储结构
--把若干条sql语句封装起来,起个名字,叫做过程,也是没有返回值的函数 --把这个过程存储在数据库中->存储过程 --存储过程的创建过程 create procedure proceduceN ...
- MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
文/何登成 导读: 来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...
- MySQL数据库InnoDB存储引擎中的锁机制
MySQL数据库InnoDB存储引擎中的锁机制 http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...
- 人人都是 DBA(VIII)SQL Server 页存储结构
当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看 ...
- MySQL数据库Raid存储方案
作为一名DBA,选择自己的数据存储在什么上面,应该是最基本的事情了.但是很多DBA却容易忽略了这一点,我就是其中一个.之前对raid了解的并不多,本文就记录下学习的raid相关知识. 一.RAID的基 ...
- Ubuntu上更改MySQL数据库数据存储目录
之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...
- MySQL InnoDB 逻辑存储结构
MySQL InnoDB 逻辑存储结构 从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间,而表空间由段(sengment).区(extent).页(page)组成.p ...
- MySQL数据库MyISAM存储引擎转为Innodb
MySQL数据库MyISAM存储引擎转为Innodb 之前公司的数据库存储引擎全部为MyISAM,数据量和访问量都不是很大,所以一直都没什么问题.但是最近出现了MySQL数据表经常被锁的情况,直接导 ...
- MySQL数据库InnoDB存储引擎
MySQL数据库InnoDB存储引擎Log漫游 http://blog.163.com/zihuan_xuan/blog/static/1287942432012366293667/
- 查看和改动MySQL数据库表存储引擎
要做一名合格的程序猿,除了把代码写的美丽外,熟知数据库方面的知识也是不可或缺的.以下总结一下怎样查看和改动MySQL数据库表存储引擎: 1.查看数据库所能支持的存储引擎: ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (37)-- 算法导论5.4 1题
一.一个屋子里必须要有多少人,才能让某人和你生日相同的概率至少为1/2? 必须要有多少人,才能让至少两个人生日为 7月 4 日的概率大于 1/2? 文心一言: 一个屋子里必须要有多少人,才能让某人和你 ...
- 第五部分_Shell脚本条件判断语法结构
条件判断语法结构 思考:何为真(true)?何为假(false)? 1. 条件判断语法格式 格式1: test条件表达式 格式2: [ 条件表达式 ] 格式3: [[ 条件表达式 ]] (支持正则~) ...
- 开抢| 华为开发者大会2021(Cloud)早鸟票来了!
他们,是技术的引领者 他们,是科学的追随者 他们用代码守护蓝色星球的生态 破解宇宙深处的密码 化解城市生活的不畅 捉摸自然气候的脾性 ...... 这些改变世界的成果背后 每一个开发者都了不起 --那 ...
- 非root安装Anaconda
1.下载对应版本的Anaconda (wget+路径) 下载地址:https://repo.anaconda.com/archive/ 或者清华镜像:https://mirrors.tuna.tsin ...
- IOS证书制作教程
转载:IOS证书制作教程 点击苹果证书 按钮 编辑 点击新增 编辑 输入证书密码,名称 这个密码不是账号密码,而是一个保护证书的密码,是p12文件的密码,此密码设置后没有其他地方可以找到, ...
- 剖析字节案例,火山引擎 A/B 测试 DataTester 如何“嵌入”技术研发流程
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 日前,在 WOT 全球创新技术大会上,火山引擎 DataTester 技术负责人韩云飞做了关于字节跳动 A/B 测 ...
- Solon2 常用注解之 @Component 与 @Bean 的区别
@Component 与 @Bean 设计的目的是一样的,都是注册 Bean 到容器里. 1.@Component 注解 及它的子类型 @Configuration,@Controller,@Remo ...
- Nginx The system cannot find the path specified
Nginx -t 时报 (3: The system cannot find the path specified) 原因:路径中有文件夹是中文,Nginx 全路径,不能包含中文
- 【Flask】cbv源码分析 flask模板使用 flask请求与响应 session及源码分析 闪现flash 请求扩展
目录 上节回顾 今日内容 1 cbv分析 1.1 源码分析 2 模板 2.1 app.py 2.2 index.html 3 请求与响应 4 session及源码分析 4.1 session的使用 4 ...
- Android 启动优化(二) - 有向无环图的原理以及解题思路
Android 启动优化(一) - 有向无环图 Android 启动优化(二) - 拓扑排序的原理以及解题思路 Android 启动优化(三) - AnchorTask 使用说明 Android 启动 ...