【发布时间】:2016-09-04 23:58:07
【问题描述】:
我有以下疑问,
SELECT * FROM users,
(SELECT *
FROM mastery
WHERE champion_rank = 1
ORDER BY global_rank ASC
LIMIT 3) as ranks
WHERE users.id = ranks.user_id
Mastery 有 22M 行,users 有 5M 行。上面的查询需要 1800 毫秒才能完成。
问题是下面的子查询在自己运行时需要2.5ms来执行
SELECT *
FROM mastery
WHERE champion_rank = 1
ORDER BY global_rank ASC
LIMIT 3
从 users 表中检索单个用户需要 2.5 毫秒
SELECT * FROM users WHERE id = 4234523
所以理论上,如果我只是修改我的代码来执行第一个子查询,然后为返回的每一行运行一个额外的查询,整个过程将需要 2.5 + (3 * 2.5) = 10 毫秒来运行。
postgres 肯定在做一些奇怪的事情吗?
数据库结构和索引可以看here
【问题讨论】:
-
为什么不使用连接?另外,你把索引放在桌子上了吗?
标签: sql postgresql postgresql-performance