像 InnoDB 这种底层存储结构,在代码层面是如何实现的呢

2021-01-05 14:05:46 +08:00
 zxCoder

比如很多书上以及文档都会讲这个存储引擎的存储结构,比如记录的结构,页的结构,那么这些东西映射到代码层面是怎么实现的呢?

比如一个页,里面有很多个记录,对应到内存和硬盘里,是一堆字节,那我们的程序代码要处理的时候,是需要讲这块的内容读到内存,然后类似反序列化转化为我们代码中的一些结构体比如 Page,Record 对吗?然后操作的逻辑就是对这些对象操作,最后再序列化刷回磁盘这样子吗?

按书上的做法,页面的 UserRecords 里的记录删除后只是会先打一个标记,那么为什么不这样做,比如这个页面的记录在我们代码中体现的就是一个 LinkList,我们可以直接删掉要删掉的记录,再序列化写回磁盘里。

这块想不太清楚,希望各位大佬指点一下。

3422 次点击
所在节点    数据库
25 条回复
extreme
2021-01-06 02:11:57 +08:00
@carlclone
https://dev.mysql.com/doc/refman/5.6/en/innodb-purge-configuration.html

InnoDB does not physically remove a row from the database immediately when you delete it with an SQL statement. A row and its index records are only physically removed when InnoDB discards the undo log record written for the deletion. This removal operation, which only occurs after the row is no longer required for multi-version concurrency control (MVCC) or rollback, is called a purge.

需要翻译成中文给你吗
carlclone
2021-01-06 07:05:57 +08:00
@extreme 一条记录是怎么被 physically remove 的? 在 record 的 delete mask 上标记删除然后放入 free list 不是吗?事务这里根本都还没对 record 进行标记删除
zxCoder
2021-01-06 08:56:22 +08:00
@extreme 多谢多谢 这个指针的转换看懂了
extreme
2021-01-06 17:09:52 +08:00
@carlclone 那为什么事务这里还没删除呢?那一段英文需要翻译成中文给你吗?
xxxyh
2021-01-06 17:24:41 +08:00
@extreme @carlclone
我认为你俩说的都没错,只是维度不一样.
1.一个事务删除一条记录的时候实际上是没有立即删除的,只是记录了 undolog,因为考虑到 mvcc 还有其他事务要读,这里的删除指的是内存里的删除。
2.删除的时候只标记为删除,后续复用的理解也是没问题的,这里的删除指的是从磁盘删除。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/741845

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX