首页 > 数据库 >MySQL数据存放相关问题?

MySQL数据存放相关问题?

时间:2023-09-13 22:44:41浏览次数:46  
标签:字节 记录 列表 存放 MySQL 相关 null 数据

MySQL 的数据存放在哪个文件?

MySQL 的数据存放在哪个文件?

存放在idb文件中

表空间文件的结构是怎么样的?

段-区-页-行,四个等级

行:保存数据的最小单位

页:mysql按照页读取数据,默认页大小为16KB

区:

B+ 树中每一层都是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中相邻的两个页之间的物理位置并不是连续的,可能离得非常远,那么磁盘查询时就会有大量的随机I/O,随机 I/O 是非常慢的。

用于innodb管理数据,默认区大小为1MB,可以存储连续的64个页

段:

段一般分为数据段、索引段和回滚段等。

  • 索引段:存放 B + 树的非叶子节点的区的集合;
  • 数据段:存放 B + 树的叶子节点的区的集合;
  • 回滚段:存放的是回滚数据的区的集合,之前讲事务隔离 (opens new window)的时候就介绍到了 MVCC 利用了回滚段实现了多版本查询数据。

InnoDB 行格式有哪些?

InnoDB 提供了 4 种行格式,分别是 Redundant、Compact、Dynamic和 Compressed 行格式。

Mysql5.7之后默认使用Compredded格式

COMPACT 行格式长什么样?

|变长字段长度列表|NULL列表|头信息|row_id|trx_id|roll_ptr|列1值|列2值|...|列n值

前三者都是记录的额外信息,后面的才是记录真实信息

记录的额外信息

分为三个部分:不定长字段长度列表,null值列表,头信息

不定长字段列表

保存着行的所有不定长字段占用字节大小,例如varcahr,text的长度都是保存在这里。

列表的信息和字段顺序相反,例如 有两个字段name,phone可以为空。

不定长字段列表保存的顺序从左到右是phone,name。

为什么「变长字段长度列表」的信息要按照逆序存放?

可以提交cpu缓存的命中率,并且记录头信息指向的是下一个记录的指针,从记录头信息往左读就是第一行数据的不定长长度,往右读是第一行的真实数据,比较方便

每个数据库表的行格式都有「变长字段字节数列表」吗?

不是,如果没有不定长字段就没有这个列表,节省空间

NULL 值列表

将存储着null值的字段保存到null值列表,也是按照字段顺序逆序排放,用01区分是否存放null

每个数据库表的行格式都有「NULL 值列表」吗?

不是,每个字段都不是not null的时候就不会有了。null值列表至少占用1字节

「NULL 值列表」是固定 1 字节空间吗?如果这样的话,一条记录有 9 个字段值都是 NULL,这时候怎么表示?

不是固定的,9个字段是null会创建2个字节的列表,一次类推

记录头信息

delete_mask :表明这行是否被删除

next_record:保存着下一条数据的记录头next_record位置

record_type:表明当前记录的类型,0普通记录,1b+树非叶子节点,2最小记录,3最大记录

记录的真实数据

除了自己定义的,还有三个隐藏字段:row_id,trx_id,roll_ptr

  • row_id:没有指定组件或者唯一约束的时候,作为主键保存,不是必须存在,占6字节

  • trx_id:记录着这个数据是由那个事务生成的,必须存在,占6字节

  • roll_ptr:记录上一个版本的指针,必须存在,占7字节

varchar(n) 中 n 最大取值为多少?

mysql规定,除了text,和blob不计入大小,每行最大65535字节,这个大小也包括了NULL 值列表和不定长字段长度列表,但是不包括三个隐藏字段

varchar的大小和字符集有关,如果是ascii,一个字符占一个字节。

如果n要最大,理想情况只有一个字段。

如果字段 not null,最大为65533,需要两个字节记录大小

如果字段可以为null ,最大65532,需要两个字节记录大小,一个字节记录null

行溢出后,MySQL 是怎么处理的?

记录的真实数据只会保存一部分,剩下放在溢出页中,真实数据处使用20字节保存着指向溢出页的地址

标签:字节,记录,列表,存放,MySQL,相关,null,数据
From: https://www.cnblogs.com/xiuer211/p/17700986.html

相关文章

  • springcloud相关面试题
    (目录)springcloud相关面试题springcloud中网关起什么作用在SpringCloud中,网关起到了路由和过滤的作用。路由:网关通过配置路由规则,将请求转发到不同的服务实例上。它可以根据请求的URL、请求的HTTP方法、请求的Header等信息,将请求路由到相应的服务实例上。通过网关,可以实现......
  • CTyunOS安装MySQL8.0
    (CTyunOS安装MySQL8.0)最近天翼云搞活动,购了一台4U8G的服务器,这里讲解一下如何安装Mysql吧。1.yum安装yuminstall-ymysqlyuminstall-ymysql-commonyuminstall-ymysql-errmsgyuminstall-ymysql-libsyuminstall-ymysql-serveryum我们查询一下,可以看到有这......
  • Kingbase中手写Mysql底层函数DATE_FORMAT()
    Kingbase中手写Mysql底层函数DATE_FORMAT()分析底层函数的实现逻辑MySQL的DATE_FORMAT()函数其底层逻辑涉及多个组件和模块。以下是DATE_FORMAT()函数的大致实现逻辑:解析日期格式字符串:DATE_FORMAT()函数接受两个参数,一个是日期值,另一个是格式字符串。首先,MySQL解析格......
  • ubuntu安装mysql8
    默认安装5.x版本sudoaptinstallmysql-server安装8.x版本,请继续往下看:https://dev.mysql.com/downloads/repo/apt/查看最新的mysql版本apt-getupdatewgethttps://repo.mysql.com//mysql-apt-config_0.8.26-1_all.debdpkg-imysql-apt-config_0.8.26-1_all.debapt-ge......
  • ubuntu卸载mysql
    1、停止MySQL服务器sudoservicemysqlstop2、卸载MySQL服务器软件包sudoapt-getpurgemysql-server3、删除MySQL配置文件和数据sudorm-rf/etc/mysql/var/lib/mysql4、清理残留文件和目录sudoapt-getautoremovesudoapt-getautoclean   ......
  • MySql数据库中,对于同一个表,如果直接把查询结果赋值给待更新字段,则会出现锁表的情况。
    MySql数据库中,对于同一个表,如果直接把查询结果赋值给待更新字段,则会出现锁表的情况。原因是:mysql在from子句中遇到子查询时,先执行子查询并将结果放到一个临时表中,我们通常称它为“派生表”;临时表是没有索引、无法加锁的。update时,会锁表,此时不能再select。所以会报错,此时如果将......
  • MySQL中EXPLAIN用法和结果分析
    可以查看:[MySQL高级](一)EXPLAIN用法和结果分析_mysqlexplain_王洪玉的博客-CSDN博客重点信息截图: ......
  • mysql中information_schema.columns字段说明
    语句如下:SELECT *FROM information_schema.COLUMNSWHERE TABLE_SCHEMA='具体某个数据库';各字段含义如下:字段含义table_schema 表所有者(对于schema的名称)table_name 表名column_name 列名ordinal_position 列标识号column_default 列的默认值is_nullable 列的为空性......
  • MySQL 字段根据逗号分割实现列转行
    表数据: 期望数据:实现sql:selecta.id,b.help_topic_id+1,a.execute_name,#substring_index(a.execute_name,',',b.help_topic_id+1),substring_index(substring_index(a.execute_name,',',b.help_topic_id+1),',',-1)from`user`aleft......
  • MySQL为什么改进LRU算法
    LRU算法概念介绍LRU(LeastRecentlyUsed,最近最少使用)算法是一种用于缓存管理的常见算法。它的核心思想是:当需要淘汰(替换)一个数据时,选择最长时间未被访问的数据进行淘汰,即选择最近最少使用的数据。以下是LRU算法的概念介绍和基本工作原理:缓存管理:LRU算法通常用于管理缓存中的数据。......