我正在使用带有大表的PostgreSQL,查询需要花费太多时间。
我有两张桌子。第一个有大约600万行(数据表),第二个有大约30000行(用户表)。
每个用户在数据表中有大约200行。 之后,数据和用户表最多可增加30倍。
我的查询是:
SELECT d.name, count(*) c
FROM users AS u JOIN data AS d on d.id = u.id
WHERE u.language = 'eng' GROUP BY d.name ORDER BY c DESC LIMIT 10;
90%的用户拥有英语,查询时间为7秒。每列都被编入索引!
我读到了Merge Join,它应该非常快,所以我按id排序表并强制Merge Join,但时间增加到20秒。
我想,表格配置错误,但我不知道如何修复它。
我应该做出其他改进吗?
答案 0 :(得分:0)
对于此查询:
*someone else* force ordering
首先,尝试索引:SELECT d.name, count(*) c
FROM users u JOIN
data d
on d.id = u.id
WHERE u.language = 'eng'
GROUP BY d.name
ORDER BY c DESC
LIMIT 10;
,users(language, id)
。看看这是否加快了查询速度。
其次,data(id, name)
是什么?用户可以拥有多个用户吗?有没有有效值的表格?根据这些问题的答案,可能还有其他方法来构建查询。