我需要从User表中获取最新用户。以下哪个查询在Postgres中具有最佳性能。
Select MAX(u.id) from User u;
或
Select u.id from User u order by desc limit 1;
答案 0 :(得分:0)
这是对评论的详细说明。
如果您在user(id)
上有索引,则两种配方都应使用该索引。我很确定他们的执行计划基本相同。
如果你没有(b-tree)索引,那么我认为max()
版本会更快。我认为它会读取一次数据并在一次传递中提取max()
。 order by
必须对所有记录进行排序。
有时,数据库会有一些可能适用的非常具体的优化(例如可能会识别limit
和order by
的特殊情况的优化。我认为在这种情况下不适用。
答案 1 :(得分:0)
这可能取决于您的PostgreSQL版本,但我在代表性表格上测试了这两种方法(这是您应该做的):
explain analyze select max(id) from versions;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
Result (cost=0.21..0.21 rows=1 width=0) (actual time=0.034..0.034 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Limit (cost=0.08..0.21 rows=1 width=4) (actual time=0.031..0.031 rows=1 loops=1)
-> Index Only Scan Backward using index_versions_on_id on versions (cost=0.08..98474.35 rows=787172 width=4) (actual time=0.030..0.030 rows=1 loops=1)
Index Cond: (id IS NOT NULL)
Heap Fetches: 1
Planning time: 0.143 ms
Execution time: 0.062 ms
(8 rows)
explain analyze select id from versions order by id desc limit 1;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.08..0.21 rows=1 width=4) (actual time=0.025..0.025 rows=1 loops=1)
-> Index Only Scan Backward using index_versions_on_id on versions (cost=0.08..98080.76 rows=787172 width=4) (actual time=0.024..0.024 rows=1 loops=1)
Heap Fetches: 1
Planning time: 0.099 ms
Execution time: 0.044 ms
(5 rows)
这是从9.4.5开始,在一个包含860,000行的表上的唯一索引。
这表明技术的顺序稍微快一点,但对我来说,仅仅决定你应该使用那种方法是不够的 - 性能不是一切,我更喜欢max()方法的语义。