关于 mysql 的页锁

2020-12-16 16:06:30 +08:00
 Cyshall

各位,问个关于 mysql 页锁的问题。

首先页这个概念在 mysql 中有两处地方会出现,一个是 innodb 引擎中磁盘管理的最小单位,一个就是页锁,这两个地方的页是一个概念吗?

如果是的话,又产生了另外一个问题:首先页锁的粒度是在表锁和行锁之间的(行锁<页锁<表锁),但是页的大小是 16KB,一张表如果只存一行数据明显不可能大于页,那是不是可以理解在这种情况下表锁的粒度要小于页锁?(或者这里的粒度大小不是按照数据大小来的?)

其次,innodb 中的页相较于页锁中的页感觉抽象层次更低,也就是说完全是不同层次的概念了,毕竟 innodb 中的页是存数据的地方了(我知道 mysql 下面还有文件系统,文件系统中也有页的概念,这里只提 mysql )。 真的很迷惑,不知道有没有老哥可以解答一下。

1735 次点击
所在节点    程序员
8 条回复
xsm1890
2020-12-16 17:22:31 +08:00
1.一张表如果只存一行数据明显不可能大于页。这个观点首先是错误的,对于 innodb,建立一张表,预分配 6 个数据页;插入一条数据后,占用三个数据页,一个数据页包含基本信息,一个数据页包含聚簇索引信息(没有显示指定会有生成隐式的),另外一个页包含的是插入的数据,数据行长度超过七千五比特还会有一个行迁移数据页( 7500 是大概值,具体忘了)
2.关于页层次的问题。首先,MySQL 是个插拔式引擎的数据库,innodb 只是其中一种存储引擎。所以个人觉得,这里并没有层次高低的问题,只是两种不同层面的说法而已;但是 mysql 层面的页包含的东西会更大些而已
cherryQWE
2020-12-16 17:31:52 +08:00
问:...一张表如果只存一行数据明显不可能大于页,那是不是可以理解在这种情况下表锁的粒度要小于页锁?
答:不会啊,只有一条数据的话,也是存在一个 16k 页上,表是页的外层容器(找不到合适的词,就暂定容器吧),总之,页的大小是固定的,少于一个页了还是一个页,多了继续新增页。

问:...其次,innodb 中的页相较于页锁中的页感觉抽象层次更低,也就是说完全是不同层次的概念了,毕竟 innodb 中的页是存数据的地方了...
答:DB 内部也有一套存储结构啊,怎么会和 OS 混一起呢,两层东西呀。

你要不看看源码得了,就不会这么纠结了。
cherryQWE
2020-12-16 17:34:42 +08:00
一个 InnoDB 页中存储了一堆槽,槽记录的是每个数据块中最小行记录(按某种方式排序:主键或者索引键),但是每个槽对应一个数据块,这个数据块里面又有很多数据行....
Cyshall
2020-12-16 17:55:32 +08:00
@xsm1890 懂了懂了,非常感谢。
louettagfh
2020-12-16 21:51:23 +08:00
@xsm1890 你这是哪里看的 InnoDB 的 B+ tree 插入一个 record 只占一个 Page, 没有什么单独的索引, 索引即数据.
xsm1890
2020-12-17 10:42:50 +08:00
@louettagfh 没错,可以说索引既数。总结这句话的人的意思是 innodb 的数据文件索引和数据是在同一个文件中(既 table_name.ibd 文件),而不是像 myisam 一样有单独的索引数据文件( table_name.MYI ),更不是你理解的那样没有单独的索引。我所说的页包含聚簇索引及下一个页包含一条数据,是 table_name.ibd 文件的内部数据组织方式,木有任何问题。
louettagfh
2020-12-17 10:48:11 +08:00
@xsm1890 这是 B+ tree 的组织方式,和 .ibd 没有关系.
xsm1890
2020-12-17 11:21:59 +08:00
@louettagfh 那 B+ tree 总得存在磁盘上吧?

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

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

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

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

© 2021 V2EX