一篇文章搞懂mysql数据库底层数据存储逻及保存数据过程

前沿:

我们知道mysql数据和结构都存储在磁盘,这样才能保证数据的持久性,那么数据和结构是如何存储的呢?这就是今天我们要讨论的话题。

 正文:

 数据库有俩个文件,一个是以.frm结尾的文件,另外一个是以.ibd结尾。而表的定义存储在.frm文件中,索引数据存储在.ibd中。那么.ibd文件中的结构又是如何的呢?

我们从大到小说,.ibd文件也被成为表空间,表空间是由多个数据区组(也有叫segment段)组成,数据区组由256个数据区(extent)组成,一个数据区的大小最小为 1MB,那么数据区组是256M。一个区又由64个数据页(page)组成,一个数据页的大小是16kb,16kb * 64正好是1M的大小。最后数据页是由文件头、数据页头、最大最小记录、数据区、数据页目录、文件尾部,其中数据区里才是我们保存的一条一条数据。

那么数据页中的一条数据又包括那些东西呢?他包括变长字段列表、null值列表、数据头、实际数据。所以这也能解释数据库规范中,强烈建议表字段设置为非空的原因。

接下来我们聊聊另外一个话题,当我们修改一条数据的时候,整个过程是咋样的呢?

  1. 首先我们要知道待修改的那条数据在哪里?如果条件中包含索引,那么先根据索引结构找到主键ID,再由ID到主键索引中找到该条数据。
  2. 为了效率,会将该条数据所在的整个数据页加载到缓冲池Buffer Pool中。
  3. 这个时候再该页上加独占锁
  4. 将更新前的数据保存到undo log(回滚日志)中,防止事务回滚。
  5. 更新数据
  6. 将redo log(重做日志) 写入redo log buffer中,防止服务器崩溃,数据丢失。
  7. 将修改后的数据页刷回磁盘
  8. 释放锁
  9. 将redo log buffer 日志刷回磁盘,这个时候该条修改的日志不会丢失。

上面有一个问题,redo log buffer啥时候刷磁盘呢?数据库是这样设计的:

  1. 如果一次性redo log buffer的内存超过一半,默认超过8M,会直接刷盘。
  2. 提交事物的情况下会刷盘。
  3. 后台线程定时将redo log buffer刷盘,顺序写入磁盘。
  4. mysql 停止服务触发刷盘。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL数据库底层使用了多种数据结构来实现索引和存储数据。其中一种常见的数据结构是B树。B树是一种自平衡的搜索树,它允许在对数时间内进行插入、删除和查找操作。B树的特点是每个节点可以存储多个键和对应的值,并且按照键的顺序排列。这使得B树能够高效地支持范围查询。 在MySQL中,为了提高查询效率,通常会使用索引来加速查询操作。索引可以理解为按照某个列或多个列的值进行排序的数据结构,它可以帮助数据库快速定位到符合查询条件的数据MySQL中使用的索引结构包括B树索引和哈希索引。 B树索引是MySQL最常用的索引结构。它使用B树数据结构来组织数据,并且支持范围查询。B树索引适用于大部分查询场景,特别是范围查询和排序操作。对于范围查询,B树索引可以快速定位到符合条件的数据所在的叶子节点,然后沿着叶子节点链表遍历获取所有符合条件的数据。 除了B树索引,MySQL还支持哈希索引。哈希索引使用哈希表数据结构来存储索引数据,它适用于等值查询操作,可以快速定位到具有相同哈希值的数据。然而,哈希索引不支持范围查询和排序操作,所以在实际应用中使用较少。 综上所述,MySQL数据库底层使用了B树和哈希等数据结构来实现索引和存储数据。B树索引是最常用的索引结构,支持范围查询和排序操作,而哈希索引适用于等值查询操作。这些数据结构的选择取决于具体的查询需求和性能要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值