【问题标题】:Clustered index in PostgreSQL?PostgreSQL中的聚集索引?
【发布时间】:2017-01-16 11:36:35
【问题描述】:

我有一张桌子:

CREATE TABLE users (
        id BIGSERIAL PRIMARY KEY,
        first_name varchar(255) NOT NULL,
        last_name varchar(255) NOT NULL,
        cell_id   BIGINT                  
        ...
)

cell_id 是来自 s2 的 uint64,可以表示地球上的任何位置。

->click here for good description of s2

现在我想在 cell_id 上有一个索引,主要是为了使用相等运算符。

CREATE INDEX user_position ON users (cell_id);

但是现在我担心这个索引会被过度更新和查询,最终导致死锁。

所以我有了做这样的事情的想法

CREATE INDEX user_position_even ON users (cell_id) WHERE user id % 2 = 0
CREATE INDEX user_position_odd ON users (cell_id) WHERE user id % 2 = 1

甚至可能会添加更多索引/稀缺性。

现在我有一些问题:

  1. 当我进行查询时,Postgres 会使用这两个索引吗?
  2. 这是否有助于保持性能?
  3. 我的第一个问题是不是错了?
  4. 我应该只使用不同的表而不是索引吗?
  5. 还有其他更好的方法吗?

【问题讨论】:

  • 您的查询不会过滤id 列(例如,仅按位置查询users 表。cell_id)不会使用您的任何“集群”索引。 -- 索引本身不会导致死锁,死锁通常涉及多个表。
  • 旁注:PostgreSQL doesn't have a true unsigned integer type。如果您可以在您的客户端中解决这个问题(f.ex. 带有一些二进制重新解释),那很酷,否则您可以使用一些扩展,f.ex。 pguint.
  • 感谢@pozs,是的,我正在使用二进制重新解释
  • 关于您的第一条评论:所以因为我使用的是相等性,所以不会使用索引?
  • 我的意思是使用FROM users WHERE cell_id = $1 AND id % 2 = 0 的查询肯定会使用该索引,WHERE cell_id = $1 AND id = $2 可以使用其中一个索引,但只有WHERE cell_id = $1 不会使用任何这些索引。

标签: sql postgresql


【解决方案1】:
  1. 当我进行查询时,Postgres 会使用这两个索引吗?

虽然 postgresql 可以在一张表上使用多个索引,但您的 id 可以被 2 整除或不可整除,因此只能使用这些索引中的一个。

  1. 这是否有助于保持性能?

不太可能。 postgresql 上的default index type 是 B-Tree,在这里您实际上是在自己做索引将为您做的部分工作。但只是为了确定基准。

  1. 我的第一个问题是不是错了?

我会说这称为过早优化。 B-Tree indexes are pretty good 处理它。如果你真的陷入僵局,请回到这里

B-tree、GiST 和 SP-GiST 索引
短期分享/独占页面级别 锁用于读/写访问。锁被立即释放 在获取或插入每个索引行之后。这些索引类型提供 没有死锁条件的最高并发。

  1. 我应该只使用不同的表而不是索引吗?

不,Postgresql 可以处理非常大的表。如果这成为一个问题。分区。

  1. 还有其他更好的方法吗?

您没有损坏需要修理的东西。回来后回来。

【讨论】:

  • 啊哈,过早的优化!现在我不能不同意你的看法。感谢您的回答,将尝试使用简单的默认方式,看看我们是否需要改进。
  • 另外我必须补充一点,其中很多 cell_id 将是相似的,因为城市。这就是为什么我认为页面中会有锁的原因。但这肯定会因为会有很多页面而得到缓解。
  • 或者如果我减小单元格的大小
  • 大 int 到 int 不会有太大区别。如果您担心存在重复的 cell_ids,则根据您在其上执行的查询,该担忧可能有道理,也可能没有道理。我认为最好运行几天并发布另一个问题,其中包含您发现速度较慢的完整查询以及explain analyze 的结果
  • 哇! :) 会做 !感谢您宝贵的时间!
猜你喜欢
  • 2013-08-07
  • 1970-01-01
  • 2015-07-31
  • 2018-05-08
  • 2020-09-17
  • 2020-08-04
  • 2021-01-14
  • 1970-01-01
相关资源
最近更新 更多