插件到资料库到作业系统到液态硬碟
在我研究了从插件推送的单纯 SQL 查阅是怎样最后储存到硬盘的操作过程中,我发现名词 “页(page)” 和 “块(block)” 可能是计算机科学中最兼用的基本概念之一。有资料库页(database page),作业系统数据库系统页(virtual memory page),磁盘块(file system block),液态硬碟页(SSD page),三种类别的固态硬碟块(SSD block),当中两个称作方法论块(logical block),相关联于磁盘,另两个是Villamblard的模块,称作抹除块(erase unit),当中包涵数个页。大部份那些模块都能具备相同的大小,很多相匹配,很多不相匹配。
在责任编辑中,我将详尽如是说两个 SELECT 句子以及在继续执行操作过程中相同层级的输入 / 输出(I/O)是怎样一直继续执行到硬盘的下层。
这儿是他们即将说明的完备库尔:
但具体来说,基本知识当您在资料库中建立两个表时,会在硬盘上建立两个文档,并将统计数据产业布局在一般来说大小不一的资料库页中。统计数据在页中的产业布局方式依赖于发动机是行储存还是列储存。将页视作一种结构,它具备file和统计数据,统计数据部分是行所处的边线。
资料库页能是 8KB(Postgres)或 16KB(比如 MySQL InnoDB)或Villamblard。表被储存为文档中的页字符串,当中网页检索 + 大小不一告诉资料库确凿的差值和加载量。比如,假定资料库页大小不一为 8KB,要从硬盘上加载第 7 页,您需要找寻差值 7 * 8192 + 1,因此您将加载 8192 二进制的宽度。
行及其大部份列依序储存在页中。如果行难以适应环境页中余下的内部空间,则会重新分配两个新网页,并将渣打银行放进新网页中。
有了那些基本知识,让他们继续执行此查阅,查阅表以 “STUDENTS”,当中包涵两个类别为 “serial” 的 ID 表头(死板递减)。该表有 20,000 行,分布在 20 个网页中。他们所需的行(1008 行)位于网页 1(第三个网页)。内存中没有任何数据。为的是保持单纯,我不急于在这儿包涵检索,只是为的是保持单纯,虽然会比较慢。为简洁起见,我只画出前三个网页。
SELECT NAME FROM STUDENTS WHERE ID = 1008;
无论他们是使用主检索作为表的聚簇检索,还是在没有主检索的情况下使用堆表(如在 PostgreSQL 中),我认为这儿的模型是相似的。尽管 ID 表头没有建立检索,在 InnoDB 的情况下,您能将另两个表头视为主键,它会强制他们进行全检索扫描,当中他们加载主检索的叶子网页;而在 PostgreSQL 中,则会对表进行顺序扫描。他们假定每个网页大小不一为 8KB。
资料库资料库解析并理解查阅,由于 ID 表头没有
资料库从网页 0 开始,并检查网页 0 是否在缓冲池中。缓冲池是大部份资料库进程之间共享的内存内部空间,用于储存网页,也能在当中进行写入操作。资料库没有找到网页 0,因此它向表文档推送加载网页 0 的请求。
文档的差值是 0*8192,他们要加载 8192 二进制。网页被加载并放置在共享缓冲区内存中。网页包涵行 1 到 1000,资料库解析网页,反序列化并在内存中查找每行的 ID 值,但没有找到。因此,他们继续加载网页 1。
加载网页 1 时,文档的偏移边线为 1*8192,他们要加载 8192 二进制。网页 1 被放置在共享缓冲区中,与页面 0 一起储存。资料库在网页中查找行 1008,并找到并返回给用户。
现在让他们进一步细分,看看资料库向作业系统发出加载请求时能发生什么。
磁盘磁盘以块或方法论块的单位从硬盘加载和写入统计数据。那些单位的大小不一能从 512 二进制到 4KB 不等,当中 4KB 是最常见的大小不一。
作业系统接收到加载文档差值为 0,加载 8192 二进制的请求,并使用磁盘检索节点或 “inode” 将请求的二进制映射到磁盘块。每个方法论磁盘块地址(LBA)映射到储存设备中的特定物理块,他们将在后面学到这一点。如果您加载单个二进制,实际上会从硬盘中加载整个块。
当请求从差值 0 开始加载 8192 二进制时,操作系统继续执行以下检查:
文档的差值 0 到 8192 二进制之间的块是哪些?假定磁盘块大小不一为 4KB,则得到两个块。磁盘查找文档的检索节点以查找方法论块地址(LBA),假定那些块是 100 和 101。4KB,与块大小不一相相匹配。因此,两个块能适配到两个内存页中。假定作业系统在页内存中未找到块 100 和 101,因此准备从硬盘中加载。注意,检索节点包涵有关文档的其他元统计数据,比如权限信息。
储存他们了解到加载页 0 相当于差值 0 和宽度 8192,它被转换为磁盘块 100 和 101,每个块的大小不一为 4KB。作业系统检查了内存,但找不到那些块,因此从硬盘中加载。
假定使用 NVMe 液态硬碟,作业系统通过 NVMe 驱动向储存设备推送加载命令。加载命令有许多参数,但最重要的是起始 LBA(方法论块地址),第三个参数是要加载的块数。这意味着驱动程序发出了两个加载命令,传递了 (100, 0)。宽度为 0 表示在 NVM 命令集中加载 1 个块。
现在有趣的地方来了。在 NVMe 中,“块” 的大小不一可能与磁盘块大小不一相同。比如,在这儿他们假定 NVMe 块与磁盘块大小不一相同,都是 4KB。如果它们相同,作业系统需要更改加载参数。比如,如果 NVMe 块大小不一为 2KB,则磁盘块大小不一将包涵 2 个 NVMe 块。因此,加载命令将为 101, 3。
液态硬碟(SSD)被分成网页,这是最小的读写模块。SSD 的 NAND 网页目前的大小不一为 16KB。网页被分组成Villamblard的模块,通常也称作块,以抹除模块的方式。要写入 SSD 网页,网页必须处于抹除状态,而单独抹除网页是不可能的,必须抹除整个擦除模块。
现在,他们的 NVMe 方法论块地址映射到这个网页中的两个差值。因此,在这种情况下,由于他们的 NVMe 方法论块大小不一为 4KB,4 个块适合于 SSD NAND 网页。
SSD 实际上并不使用逻辑块地址,它只知道网页的物理边线。因此,需要进行从方法论块地址到物理网页差值的转换。由于 SSD 网页能大于块,数个块能映射到相同差值的同一网页上。
NVMe 控制器接收到加载 LBA 100 和 LBA 101 的命令,NVMe 驱动器的两个特点是,那些方法论块地址(这两个块)被转换为物理网页和差值,比如网页 99 和差值 0x0001 和 0x1002。接下来,NVMe 控制器检查本地
存中(整个 16KB),相应的块会从网页中提取并返回给作业系统主机。在这种情况下,只返回了前 8KB。
你可能会问为什么不让作业系统直接访问网页的物理地址?为什么需要进行这种转换?原因是硬盘有时需要移动统计数据,当作业系统指向物理边线时,移动统计数据变得困难。
具备讽刺意味的是,能将统计数据的移动卸载到主机上,但这不会增加插件的复杂性成本。没有免费的午餐。这是两个深入研究的课题,你能决定深入探索。
回到文档系统回到资料库然后,操作系统将控制权返回给资料库插件,如果你还记得,它发出了加载差值为 0、宽度为 8192 的请求,相关联于网页 0。资料库将原始二进制放进共享缓冲池内存(与磁盘内存相同)。网页 0 现在对于从中提取统计数据的任何其他查阅都是 “热点”,在刷新到硬盘之前,网页 0 能接收写入操作。
当然,下两个网页,即网页 1,也经历了同样的操作过程,直到找到行 ID 为 1008 的行。
总结要从资料库中加载一行统计数据,你必须加载包涵渣打银行的网页。为的是加载资料库网页,资料库会向文档发出正确差值和宽度相关联于网页的加载请求。作业系统将那些二进制映射到磁盘块地址(或 LBAs),对比磁盘网页内存,看是否存在具备那些块的内存网页。否则,会向储存控制器推送加载命令。设备将方法论块转换为物理地址,并将网页加载到内存中,并将所请求的二进制返回给作业系统主机。主机将块放进磁盘网页内存,并返回给资料库,资料库将网页放进共享缓冲池中并开始处理,并将所请求的单行返回给用户。
如果你喜欢我的文章,点赞,