SQL中带WHERE与AND子句的查询是否会使用指定owner_id索引?
索引使用问题解答
数据表结构
CREATE TABLE profile ( id BIGSERIAL PRIMARY KEY, nickname VARCHAR, registered_at TIMESTAMP ); CREATE TABLE post ( id BIGSERIAL PRIMARY KEY, owner_id BIGINT REFERENCES profile(id), body TEXT, inserted_at TIMESTAMP, likes_count INT );
已创建的索引
CREATE INDEX ON post (owner_id);
查询语句
SELECT * FROM post WHERE likes_count = ? AND owner_id = ?
问题解答
这个查询有可能会用到owner_id索引,但不是必然的,取决于实际数据分布:
- 当匹配
owner_id = ?的记录数量较少时,数据库优化器会优先使用owner_id索引,先通过索引定位到该用户的所有帖子,再在这些结果里过滤出likes_count = ?的条目。 - 如果某个
owner_id对应的帖子数量极多(比如上万条),优化器会判断全表扫描的成本更低,就不会使用这个索引。
如果想要让这个查询的索引使用更稳定、性能更优,建议创建复合索引:
CREATE INDEX ON post (owner_id, likes_count);
这个复合索引可以同时匹配owner_id和likes_count两个条件,直接通过索引获取符合要求的记录,无需额外过滤。
内容的提问来源于stack exchange,提问作者Николай Беляков
相关产品推荐
相关产品推荐

