PostgreSQL中的聚簇索引?

时间:2017-01-16 11:36:36

标签: sql postgresql

我有一张桌子:

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. 还有其他方法可以做得更好吗?

1 个答案:

答案 0 :(得分:0)

  1. Postgres在查询时会使用两个索引吗?
  2. 虽然postgresql当然可以在表上使用多个索引,但是你的id可以被2整除或不可分割,因此只能使用其中一个索引。

    1. 这有助于保持表演吗?
    2. 不太可能。 postgresql上的default index type是B-Tree,在这里,你几乎可以自己完成索引为你做的部分工作。但基准测试只是为了确定。

      1. 我的第一个担忧是错误的吗?
      2. 我会说这称为过早优化。 B-Tree indexes are pretty good处理它。如果你真的陷入僵局,请回到这里

          

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

        1. 我应该只使用不同的表而不是索引吗?
        2. 不,Postgresql可以处理非常大的表。如果这成为一个问题。分区。

          1. 还有其他方法可以做得更好吗?
          2. 你没有破碎的东西,需要修理。你做的时候回来。