各位,问个关于 mysql 页锁的问题。
首先页这个概念在 mysql 中有两处地方会出现,一个是 innodb 引擎中磁盘管理的最小单位,一个就是页锁,这两个地方的页是一个概念吗?
如果是的话,又产生了另外一个问题:首先页锁的粒度是在表锁和行锁之间的(行锁<页锁<表锁),但是页的大小是 16KB,一张表如果只存一行数据明显不可能大于页,那是不是可以理解在这种情况下表锁的粒度要小于页锁?(或者这里的粒度大小不是按照数据大小来的?)
其次,innodb 中的页相较于页锁中的页感觉抽象层次更低,也就是说完全是不同层次的概念了,毕竟 innodb 中的页是存数据的地方了(我知道 mysql 下面还有文件系统,文件系统中也有页的概念,这里只提 mysql )。 真的很迷惑,不知道有没有老哥可以解答一下。
1
xsm1890 2020-12-16 17:22:31 +08:00 2
1.一张表如果只存一行数据明显不可能大于页。这个观点首先是错误的,对于 innodb,建立一张表,预分配 6 个数据页;插入一条数据后,占用三个数据页,一个数据页包含基本信息,一个数据页包含聚簇索引信息(没有显示指定会有生成隐式的),另外一个页包含的是插入的数据,数据行长度超过七千五比特还会有一个行迁移数据页( 7500 是大概值,具体忘了)
2.关于页层次的问题。首先,MySQL 是个插拔式引擎的数据库,innodb 只是其中一种存储引擎。所以个人觉得,这里并没有层次高低的问题,只是两种不同层面的说法而已;但是 mysql 层面的页包含的东西会更大些而已 |
2
cherryQWE 2020-12-16 17:31:52 +08:00
问:...一张表如果只存一行数据明显不可能大于页,那是不是可以理解在这种情况下表锁的粒度要小于页锁?
答:不会啊,只有一条数据的话,也是存在一个 16k 页上,表是页的外层容器(找不到合适的词,就暂定容器吧),总之,页的大小是固定的,少于一个页了还是一个页,多了继续新增页。 问:...其次,innodb 中的页相较于页锁中的页感觉抽象层次更低,也就是说完全是不同层次的概念了,毕竟 innodb 中的页是存数据的地方了... 答:DB 内部也有一套存储结构啊,怎么会和 OS 混一起呢,两层东西呀。 你要不看看源码得了,就不会这么纠结了。 |
3
cherryQWE 2020-12-16 17:34:42 +08:00
一个 InnoDB 页中存储了一堆槽,槽记录的是每个数据块中最小行记录(按某种方式排序:主键或者索引键),但是每个槽对应一个数据块,这个数据块里面又有很多数据行....
|
5
louettagfh 2020-12-16 21:51:23 +08:00
@xsm1890 你这是哪里看的 InnoDB 的 B+ tree 插入一个 record 只占一个 Page, 没有什么单独的索引, 索引即数据.
|
6
xsm1890 2020-12-17 10:42:50 +08:00
@louettagfh 没错,可以说索引既数。总结这句话的人的意思是 innodb 的数据文件索引和数据是在同一个文件中(既 table_name.ibd 文件),而不是像 myisam 一样有单独的索引数据文件( table_name.MYI ),更不是你理解的那样没有单独的索引。我所说的页包含聚簇索引及下一个页包含一条数据,是 table_name.ibd 文件的内部数据组织方式,木有任何问题。
|
7
louettagfh 2020-12-17 10:48:11 +08:00
@xsm1890 这是 B+ tree 的组织方式,和 .ibd 没有关系.
|
8
xsm1890 2020-12-17 11:21:59 +08:00
@louettagfh 那 B+ tree 总得存在磁盘上吧?
|