【发布时间】:2013-11-13 07:27:36
【问题描述】:
我有一个简单的选择查询:
SELECT * FROM entities WHERE entity_type_id = 1 ORDER BY entity_id
然后我想得到前100个结果,所以我用这个:
SELECT * FROM entities WHERE entity_type_id = 1 ORDER BY entity_id LIMIT 100
问题是第二个查询比第一个查询慢得多。执行第一个查询不到一秒,执行第二个查询则超过一分钟。
这些是查询的执行计划:
无限制:
Sort (cost=26201.43..26231.42 rows=11994 width=72)
Sort Key: entity_id
-> Index Scan using entity_type_id_idx on entities (cost=0.00..24895.34 rows=11994 width=72)
Index Cond: (entity_type_id = 1)
有限制:
Limit (cost=0.00..8134.39 rows=100 width=72)
-> Index Scan using xpkentities on entities (cost=0.00..975638.85 rows=11994 width=72)
Filter: (entity_type_id = 1)
我不明白为什么这两个计划如此不同,为什么性能下降这么多。我应该如何调整第二个查询以使其更快地工作?
我使用 PostgreSql 9.2。
【问题讨论】:
-
entity_id 是主键还是有索引?
-
entity_id 是主键,entity_type_id 上有索引
-
那么你就不需要order by了,因为它已经默认按照entity_id升序排序了。
-
如果我不使用 order by,我会得到不同的结果。
-
@Kuzgun - 别傻了。在您指定“排序依据”之前,不会对任何内容进行排序。
标签: sql postgresql query-optimization