【发布时间】:2013-11-10 19:28:48
【问题描述】:
我有一个用户表和一个文档表。文档只有一个用户作为所有者,对于我正在构建的应用程序,我知道我通常会访问与单个给定用户关联的一组文档。
假设普通用户有 K 个文档,某些常见查询会获取给定用户的所有文档。我不希望我的数据库(PostgreSQL)必须进行 K 磁盘搜索(平均而言)来获取用户的所有文档。理想情况下,文档将存储在连续的块中,以便提取只需要几次搜索。
是否有可能(并且合理)组织文档表模式来创建这样的位置?我知道无 SQL 实现总是这样做吗?例如。 BigTable paper 讨论了如何通过 URL 分配 web 表的行键,除了 url 是颠倒的,例如com.cnn.www,以便 CNN 的所有页面在数据存储中彼此靠近。在 Postgres 中似乎不可能有类似的东西,因为这些表不能被索引组织,尽管在带有 InnoDB 的 MySQL 中可能是可能的。 This post 得出了类似的结论。
【问题讨论】:
-
Postgres 似乎不支持通过特定索引对表进行永久集群,这可能是因为其 MVCC 存储模型或其他一些设计决策/限制,但确实允许按需集群:请参阅此问题:stackoverflow.com/q/4796548/157957 和
CLUSTERcommand 的 Postgres 手册。 -
集群主题也自动出现在 Pg wiki 的 TODO 列表中,并附有一些(大部分相当老的)讨论的链接:wiki.postgresql.org/wiki/Todo#CLUSTER 和 wiki.postgresql.org/wiki/Todo#Indexes
标签: sql postgresql primary-key database-schema composite-primary-key