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.查看数据库所能支持的存储引擎: ...
随机推荐
- 秋风到,ModelArts“ AI市场算法Fast-SCNN指南”秋膘贴起来
本文分享自华为云社区<带你来秋日尝鲜 | ModelArts AI市场算法Fast-SCNN使用指导>,作者:Tianyi_Li 摘要:送小伙伴们一份新鲜出炉的ModelArts AI市场 ...
- 有了这个算法,图像上文字擦除再也用不上PS了
摘要:本文介绍几篇关于自然场景下文字擦除的论文工作. 图像文字擦除方法 给定一幅自然场景图像,只将图像中文字区域抹去而不改动其他区域像素值的方法称为文字擦除算法.该方法在隐私保护,身份信息篡改,数据增 ...
- 艾莫尔研究院基于Karmada的落地实践
摘要:本文从企业的业务背景.应用需求以及选择Karmada前后的对比和收益等方面,阐述了艾莫尔使用多集群技术完成企业技术升级的过程. 本文分享自华为云社区<艾莫尔研究院基于Karmada的落地实 ...
- 一文详解Java日志框架JUL
摘要:JUL(Java util logging),Java原生日志框架,不需要引入第三方依赖包,使用简单方便. 本文分享自华为云社区<Java 日志框架 JUL 详解大全>,作者: 陈皮 ...
- 火山引擎云原生数据仓库 ByteHouse 技术白皮书 V1.0 (Ⅳ)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,<火山引擎云原生数据仓库 ByteHouse 技术白皮书>正式发布.白皮书简述了 ByteHou ...
- PPT 放映电脑Office版本低怎么办
转换成全图形PPT 转成图片,无法放动画 转换成全视频 转成视频,无法控制节奏 PPT VIEWEB 本地PPT播放工具
- SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名
SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名 @GetMapping("/download") public Respons ...
- 【HZERO】值集翻译
值集翻译 值集管理: https://open.hand-china.com/document-center/doc/component/163/16090?doc_id=156008&doc ...
- L3-002 特殊堆栈 (双数组模拟栈)
堆栈是一种经典的后进先出的线性结构,相关的操作主要有"入栈"(在堆栈顶插入一个元素)和"出栈"(将栈顶元素返回并从堆栈中删除).本题要求你实现另一个附加的操作: ...
- springboot线程池的使用方式1
线程池的创建方法 总共有 7 种,但总体来说可分为 2 类: 一类是通过 ThreadPoolExecutor 创建的线程池: 另一个类是通过 Executors 创建的线程池. 1. Executo ...