首页 > 数据库 >mysql存储结构

mysql存储结构

时间:2022-12-04 15:45:47浏览次数:40  
标签:存储 varchar 字节 innodb mysql 空间 长度 磁盘 结构

表空间

 

共享表空间     独立表空间

https://www.cnblogs.com/wt645631686/p/8258070.html  

偷一手,先贴个链接 感谢这位爷

innodb_file_per_table 参数设置是否开启独立表空间

 

开启独立表空间  每个表会有一个.idb文件用于存储数据

同时在共享表空间里面 会放一些该表的其他信息

如果启用了innodb_file_per_talbe参数,需要注意的是每张表的表空间内存放的只是数据、索引和插入缓冲Bitmap页,其他数据如:回滚信息、插入缓冲索引页、系统事物信息、二次写缓冲(Double write buffer)等还是放在原来的共享表空间内。同时说明了一个问题:即使启用了innodb_file_per_table参数共享表空间还是会不断的增加其大小的。

https://www.cnblogs.com/shamo89/p/8664982.html

独立表空间的优缺点   大概看一下,并不理解

 

innodb_file_per_table

独立表空间是否开启的参数

 

 

 

段  区  页

 

 

 

 

数据段 b加树的叶子节点

索引段 b加树的非叶子节点    具体页不懂  先记一下   还有回滚段  大概是用于undo的

 

区由连续的页组成  大小固定为1MB

 

 

页的最大行数为   page_size    一般为 16KB 

16KB/2 - 200=7992

这个没找到详细的推理过程   我猜测   将一个表的所有隐藏列删除  只剩下一个主键  

然后 根据编码集合 给他来了个两字节大小的类型 比如 int16  还有两百字节要存储一些其他东西

 

晚网上偷了一个图   但是其他信息加起来也只有128字节

 

 

 

又查了一下   最大行数和页大小无关   上面那些猜测全是错的   最大行数7992 是规定  硬性规定

 

 

 

 

 

关于varchar

首先 varchar 在磁盘中和在内存中的区别

因为varchar 在磁盘中 记录的是真实长度+额外信息  比如 长度  innodb用两个字节存储长度 所以 varchar类型的最大长度是 2的16次方-1 字节  注意单位是字节

varchar类型在内存中占据的是实际声明的长度,猜测是更新数据时,不确定数据长度,需要按照声明长度给位置,不然位置不够造成页分裂之类的更麻烦

同时 声明的varchar类型字段长度单位的字符  这跟编码集有关  例如 utf8mb4 一个字符长度为4个字节   所以 varchar最大长度大约是  2的16次方除以四   比这个理论数稍微小一些,

因为还要额外存一些信息

 

再次值得一提,varchar长度指的是所有变长字段列加起来的和  ,不是单个字段的长度

 

 

 

 

compact 行记录格式

变长字段长度列表(一个或两个字节。小于255一个字节,大于255两个字节)//null标志位//记录头信息//列1//列2.。。

 变长字段表  列的逆序

变长字段长度表的存储方式给我整蒙了,怎么算数量都不对,tnnd

还有行溢出现象

但是有个问题 ,在硬盘只记录实际长度,如果varchar 字段 更新,长度从5变成500,会在磁盘中造成页分裂或其他问题?是怎么解决的呢?等待学习

 

varchar在内存中占声明长度,在磁盘中占实际长度,

页内部通过链表结构串联各个行记录。

compact的行记录格式

 

 

 

 

 

 

内存中的记录页在磁盘中是连续的吗?

一顿狂查 找到了这么一句话 

innodb数据页结构

user records,free space,page directory 这些部分为实际行记录存储空间,因此大小是动态的。  出自mysql 技术内幕  第 120 页  最下面

指的是页大小是动态还是其他的。

 

 

我认为指的是页大小是动态的,例如 一个页在物理磁盘上大小是 9KB

但是varchar声明的长度比较长   在内存中处理后变成了16KB

但是如果数据更新后大小为14KB,这么处理呢?

至少把varchar的谜团解开了

 

标签:存储,varchar,字节,innodb,mysql,空间,长度,磁盘,结构
From: https://www.cnblogs.com/bawanglong168/p/16948311.html

相关文章

  • HDFS存储小文件的危害以及解决小文件问题的方法
    HDFS存储小文件的危害以及解决小文件问题的方法:危害:  如果有大量的小文件的存在,存放的文件数目过多的话会占用很大的内存,甚至撑爆内存。  hdfs使用于高吞吐量,不适......
  • MYSQL主从复制与读写分离
    一、MySQL主从复制与读写分离1.1主从分离和读写分离的相关概述1)主从复制与读写分离在实质际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实院需求......
  • 初识C语言(结构)
    前言:C语言是一种结构化的程序设计语言。对于新手来说要想学好一门编程语言,除了要了解编程的相关知识,更要了解其结构。“万层高楼平地起”结构就是地基中到比较重要的一环,所......
  • MySQL_03--使用UPDATE根据一个表中的数据条数,更新另一个表的计数字段
    1问题描述1.1两个表的具体内容第一个表:t_user_judge包含:评委id、分配的评分作品数assignNum、完成的评分作品数judgeNum;其他信息字段。第二个表:t_distribute包......
  • 第17节-MySQL数据库备份与恢复
    1、备份1.1、备份多张表mysqldump-uroot-prootcjglscorecourse>score_course.sql1.2、备份多个数据库mysqldump-uroot-proot--databasescjglschool>......
  • sqlserver存储过程
    ref:https://blog.csdn.net/weixin_55909413/article/details/114767079https://blog.csdn.net/h610443955/article/details/83185528......
  • python(7):python连接mysql数据库并获取数据
    python连接mysql数据库下载pymysql:pipinstallpymysql编写代码:importpymysqlclassMysqlUtils:def__init__(self):self.conn_obj=pymysql.conne......
  • MySQL进阶实战6,缓存表、视图、计数器表
    一、缓存表和汇总表有时提升性能最好的方法是在同一张表中保存衍生的冗余数据,有时候还需要创建一张完全独立的汇总表或缓存表。缓存表用来存储那些获取很简单,但速度较慢......
  • mysql
    一.索引1.存储引擎:1.myisam2.innodb(默认存储引擎)2.innodb特点:(1)支持事物(2)支持外键(3)可以从灾难中恢复数据bin-log (4)数据结构为b+树,主键索引的叶子节点存储数据,......
  • MySQL进阶实战8,分区表详解
    一、分区表分区表是一个独立的逻辑表,底层是由多个物理子表组成。实现分区的代码实际上是对一组底层表的句柄对象的封装。对分区表的请求,都会通过句柄对象转化成对存储引擎的......