7

我对内存表的理解是一个将在内存中创建的表,并且尽可能少地求助于磁盘,如果有的话。我假设我有足够的 RAM 来放置那里的桌子,或者至少是其中的大部分。我不想使用显式函数在内存中加载表(如 pg_prewarm),我只想在我发出CREATE TABLEor时默认表就在那里CREATE TABLE AS select statement,除非内存已满或除非我另有说明。我并不特别关心记录到磁盘。

7 年前,这里问了一个类似的问题PostgreSQL 相当于 MySQL 内存表?. 它已收到 2 个答案,其中一个有点晚(4 年后)。

一个答案是创建一个 RAM 磁盘并为其添加一个表空间。或者使用 UNLOGGED 表。或者等待全局临时表。但是,我没有特殊的硬件,我只有普通的 RAM - 所以我不知道该怎么做。我可以使用 UNLOGGED 功能,但据我了解,仍然涉及相当多的磁盘交互(这是我试图减少的),我不确定表是否会默认加载到内存中。此外,我看不出全局临时空间是如何相关的。我对它们的理解是,它们只是可以共享的空间中的表格。

另一个答案推荐使用内存列存储引擎。然后使用一个函数将所有内容加载到内存中。我使用这种方法遇到的问题是,所引用的引擎看起来很旧且未维护,我找不到任何其他引擎。另外,我希望我不必明确诉诸使用“加载到内存”功能,而是默认情况下一切都会发生。

我只是想知道如何在 7 年后的 Postgres 12 中获取内存表。

4

1 回答 1

5

Postgres 没有内存表,我现在也没有任何关于这个主题的严肃工作的信息。如果您需要此功能,则可以使用特殊的内存数据库,如 REDIS、MEMCACHED 或 MonetDB。这些数据库有 FDW 驱动程序。因此,您可以在专门的数据库中创建内存表,并且可以通过外部表从 Postgres 使用这些表。

当只有 MyISAM 引擎时,MySQL 内存表是必要的,因为该引擎对 IO 的工作非常原始,而 MySQL 没有自己的缓冲区。现在,MySQL 拥有 InnoDB 引擎(与其他数据库一样具有现代形式的连接),并且使用 MySQL 内存表的许多论点已经过时。针对旧的 MySQL Postgres 有自己的缓冲区并且不会绕过文件系统缓存,因此所有 RAM 都可用于您的数据,您无需执行任何操作。十年前,我们不得不使用 MySQL 内存引擎来获得足够好的性能。但是在迁移到 Postgres 之后,我们在不需要使用内存表的情况下获得了更好的性能。

如果你有很多内存,那么 Postgres 可以默认使用它——通过文件系统缓存。

于 2020-03-08T04:42:42.857 回答