【发布时间】: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
甚至可能会添加更多索引/稀缺性。
现在我有一些问题:
- 当我进行查询时,Postgres 会使用这两个索引吗?
- 这是否有助于保持性能?
- 我的第一个问题是不是错了?
- 我应该只使用不同的表而不是索引吗?
- 还有其他更好的方法吗?
【问题讨论】:
-
您的查询不会过滤
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