PostgreSQL:shop_webhooks_logs表多条件查询的索引设置咨询
是否需要为shop_id创建单独索引?
表结构
CREATE TABLE shop_webhooks_logs ( id UUID NOT NULL PRIMARY KEY, shop_id UUID not null REFERENCES shop(id), topic VARCHAR, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP );
查询语句
SELECT id, shop_id FROM shop_webhook_logs WHERE id = $1 AND shop_id = $2;
问题
由于WHERE子句包含两个查询条件,是否需要为shop_id创建如下单独索引?
CREATE INDEX I_WEBHOOK_LOGS ON shop_webhook_logs(shop_id);
回答
完全不需要为当前查询创建这个单独的shop_id索引,原因如下:
id是主键,数据库会自动为主键创建唯一索引。执行WHERE id = $1 AND shop_id = $2时,数据库会通过主键索引直接定位到唯一的一行数据,之后只需校验该行的shop_id是否匹配$2即可,全程用不到单独的shop_id索引。- 单独创建shop_id索引不仅对这个查询没有性能提升,反而会增加数据写入(插入、删除、更新)时的索引维护开销,拖慢写操作效率。
如果后续有仅以shop_id为过滤条件的查询(比如SELECT * FROM shop_webhooks_logs WHERE shop_id = $1),这个索引才有存在的价值,但针对当前给出的查询场景,完全没必要创建它。
内容的提问来源于stack exchange,提问作者Ömer Ok
相关产品推荐
相关产品推荐

