我有一张桌子:
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
甚至可能会添加更多索引/稀缺性。
现在我有一些问题:
答案 0 :(得分:0)
虽然postgresql当然可以在表上使用多个索引,但是你的id可以被2整除或不可分割,因此只能使用其中一个索引。
不太可能。 postgresql上的default index type是B-Tree,在这里,你几乎可以自己完成索引为你做的部分工作。但基准测试只是为了确定。
我会说这称为过早优化。 B-Tree indexes are pretty good处理它。如果你真的陷入僵局,请回到这里
B树,GiST和SP-GiST索引
短期分享/独家页面级别 锁用于读/写访问。锁立即释放 在获取或插入每个索引行之后。这些索引类型提供 没有死锁条件的最高并发性。
不,Postgresql可以处理非常大的表。如果这成为一个问题。分区。
你没有破碎的东西,需要修理。你做的时候回来。