【发布时间】:2016-03-21 01:10:56
【问题描述】:
我有一张这样的桌子:
id | person_id | created_at
---------------------------
0 | 10 | ...
1 | 10 | ...
2 | 11 | ...
3 | 11 | ...
.. | ... | ...
我目前正在执行以下查询:
SELECT * FROM table WHERE person_id IN (10,11,12,34,58) ORDER BY created_at DESC LIMIT x OFFSET y;
我基本上想要按created_at 排序的记录,但只需要与提供的任何person_id 值相对应的记录。
是的,我有两个独立的索引:created_at 和 person_id,我一直在问自己以下问题:
- 我应该创建一个像
(created_at, person_id)这样的多列索引吗?我试图想象它是如何工作的,我认为它仍然会进行顺序扫描(即它的数据按 `created_at 排序,它会逐个记录收集匹配的数据) - 我应该像
(person_id, created_at)那样做吗?
如果我的查询是 WHERE person_id = 10 而不是 IN,我确信 (person_id, created_at) 可以解决问题,但在这种情况下我不能 100% 确定。
【问题讨论】:
-
你也可以只有 2 个索引 - 每列一个
-
这完全取决于数据的选择性和许多其他因素。您应该使用 2 个单独的索引和一个在
(person_id, created_at)上(按此顺序),并使用EXPLAIN ANALYZE {yourquery}自己查看 Postgres 使用哪种方法更好的执行计划。 -
使用
explain (analyze, verbose, buffers)检查执行计划
标签: database postgresql indexing