Mysql 知识

基础篇

  • ![[img/Paste image 1711880102657image.png]]
  • InnoDB 的数据是按「页」为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个行记录从磁盘读出来,而是以页为单位,将其整体读入内存。
    默认每个页的大小为 16KB,也就是最多能保证 16KB 的连续存储空间。
    页是 InnoDB 存储引擎磁盘管理的最小单元,意味着数据库每次读写都是以 16KB 为单位的,一次最少从磁盘中读取 16K 的内容到内存中,一次最少把内存中的 16K 内容刷新到磁盘中。
  • 在表中数据量大的时候,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照区(extent)为单位分配。每个区的大小为 1MB,对于 16KB 的页来说,连续的 64 个页会被划为一个区,这样就使得链表中相邻的页的物理位置也相邻,就能使用顺序 I/O 了。
  • 表空间是由各个段(segment)组成的,段是由多个区(extent)组成的。段一般分为数据段、索引段和回滚段等。
    索引段:存放 B + 树的非叶子节点的区的集合;
    数据段:存放 B + 树的叶子节点的区的集合;
    回滚段:存放的是回滚数据的区的集合,之前讲事务隔离 (opens new window)的时候就介绍到了 MVCC 利用了回滚段实现了多版本查询数据。
  • ![[img/Paste image 1711880475572image.png]]
  • ![[img/Paste image 1711880546526image.png]]
  • 记录头信息
    记录头信息中包含的内容很多,我就不一一列举了,这里说几个比较重要的:
    delete_mask :标识此条数据是否被删除。从这里可以知道,我们执行 detele 删除记录的时候,并不会真正的删除记录,只是将这个记录的 delete_mask 标记为 1。
    next_record:下一条记录的位置。从这里可以知道,记录与记录之间是通过链表组织的。在前面我也提到了,指向的是下一条记录的「记录头信息」和「真实数据」之间的位置,这样的好处是向左读就是记录头信息,向右读就是真实数据,比较方便。
    record_type:表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录
    • 新节点
  • 记录的真实数据
    • row_id
      如果我们建表的时候指定了主键或者唯一约束列,那么就没有 row_id 隐藏字段了。如果既没有指定主键,又没有唯一约束,那么 InnoDB 就会为记录添加 row_id 隐藏字段。row_id不是必需的,占用 6 个字节。
      trx_id
      事务id,表示这个数据是由哪个事务生成的。 trx_id是必需的,占用 6 个字节。
      roll_pointer
      这条记录上一个版本的指针。roll_pointer 是必需的,占用 7 个字节。
      如果你熟悉 MVCC 机制,你应该就清楚 trx_id 和 roll_pointer 的作用了,如果你还不知道 MVCC 机制,可以看完这篇文章 (opens new window),一定要掌握,面试也很经常问 MVCC 是怎么实现的。
      #varchar(n) 中 n 最大取值为多少?
  • 我们要清楚一点,MySQL 规定除了 TEXT、BLOBs 这种大对象类型之外,其他所有的列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过 65535 个字节。
  • 我们要先知道每个变长字段的「变长字段长度」需要用多少字节表示?具体情况分为:
    条件一:如果变长字段允许存储的最大字节数小于等于 255 字节,就会用 1 字节表示「变长字段长度」;
    条件二:如果变长字段允许存储的最大字节数大于 255 字节,就会用 2 字节表示「变长字段长度」;
    我们这里字段类型是 varchar(65535) ,字符集是 ascii,所以代表着变长字段允许存储的最大字节数是 65535,符合条件二,所以会用 2 字节来表示「变长字段长度」。
    因为我们这个案例是只有 1 个变长字段,所以「变长字段长度列表」= 1 个「变长字段长度」占用的字节数,也就是 2 字节。
    因为我们在算 varchar(n) 中 n 最大值时,需要减去 「变长字段长度列表」和 「NULL 值列表」所占用的字节数的。所以,在数据库表只有一个 varchar(n) 字段且字符集是 ascii 的情况下,varchar(n) 中 n 最大值 = 65535 - 2 - 1 = 65532。
  • ![[img/Paste image 1711881500129image.png]]

索引

  • ![[img/Paste image 17118816854612c468a9afeb3060875c8901c888c58bf_%E7%B4%A2%E5%BC%95%E6%8F%90%E7%BA%B2.png]]
  • 索引常见面试题

新节点

新节点


评论
avatar
Haostart
个人学习用站点
Follow Me
公告
This is my Blog
最新文章
网站信息
文章数目 :
34
本站访客数 :
本站总浏览量 :
最后更新时间 :