人工智能在智慧农业中的应用
|
对于后两种情况,二级索引中的 ctid 字段不是按照字典顺序递增的,这与自动递增主键的情况不同。
假设我们需要更新该表中的一条记录,比如我们要更新 al-Khwārizmī的出生年份。如前所述,行的元组是不可变的。因此,为了更新记录,我们向表中添加了一个新的元组。这个新的元组有一个新的 ctid,我们将其称为 I。Postgres 需要区分新元组 I 与旧元组 D。在内部,Postgres 在每个元组中保存了一个版本字段和一个指向先前元组的指针(如果有的话)。因此,表的最新结构如下所示: Uber 的早期架构包含了一个用 Python 开发的单体后端应用程序,这个应用程序使用 Postgres 作为数据存储。从那个时候开始,Uber 的架构已经发生了巨大变化,变成了微服务,并采用新的数据平台模型。具体地说,之前使用 Postgres 的地方,现在改用 Schemaless,一种构建在 MySQL 之上的新型数据库分片层。在本文中,我们将探讨 Postgres 的一些缺点,并解释为什么我们要在 MySQL 之上构建 Schemaless 和其他后端服务。 1. Postgres 架构我们遭遇了 Postgres 的诸多限制:
我们将通过分析 Postgres 的表和索引在磁盘上的表示方式来探究以上这些限制,并将其与 MySQL 的 InnoDB 存储引擎进行比较。请注意,我们的分析主要是基于我们对较旧的 Postgres 9.2 版本系列的经验。据我们所知,在本文中讨论的内部架构在较新的 Postgres 发行版中并未发生显著变化,并且至少自 Postgres 8.3 发行版(现在已近 10 岁)以来,9.2 版本的基本设计都没有发生显著变化。 磁盘表示 一个关系型数据库必须能够执行一些关键任务:
这些功能如何协同工作是设计数据库磁盘数据表示的重要部分。 Postgres 的一个核心设计是不可变数据行。这些不可变数据行在 Postgres 中被称为“元组”。这些元组通过 ctid 来唯一标识。从概念上看,ctid 表示元组在磁盘上的位置(即物理磁盘偏移)。可能会有多个 ctid 描述单个行(例如,为了支持 MVCC,可能存在一个数据行的多个版本,或者一个数据行的旧版本还没有被 autovacuum 进程回收掉)。元组集合构成一张表。表本身是有索引的,这些索引被组织成某种数据结构(通常是 B 树),将索引字段映射到 ctid。
通常,这些 ctid 对用户是透明的,但了解它们的工作原理有助于了解 Postgres 表的磁盘结构。要查看当前行的 ctid,可以在语句中将“ctid”添加到列列表中: (编辑:广元站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

