我已经让这个查询运行得很好,但问题是当我的 4 个表变得太大时,它会变得很慢。
我该如何优化呢?
SELECT
all_records.user_id,
users.NAME,
users.IMAGE
FROM (
SELECT user_id FROM comments
WHERE commentable_id = #{object.id}
AND commentable_type = '#{object.class.to_s}'
UNION ALL
SELECT user_id FROM hello
WHERE helloable_id = #{object.id}
AND helloable_type = '#{object.class.to_s}'
UNION ALL
SELECT user_id FROM foo
WHERE fooable_id = #{object.id}
AND fooable_type = '#{object.class.to_s}'
UNION ALL
SELECT user_id FROM bar
WHERE barable_id = #{object.id}
AND barable_type = '#{object.class.to_s}'
) AS all_records
INNER JOIN users ON users.id = all_records.user_id
GROUP BY
all_records.user_id,
users.NAME,
users.IMAGE
LIMIT 15
查询应该做的是获取在 (4) 表上执行某些操作的唯一用户(请原谅表名称的更改)。即使使用LIMIT 15
它仍然运行缓慢,因为我认为它仍然可以读取所有 4 个表。我这样做是对的还是有什么方法可以优化它?
供参考:我正在使用 postgres 并使用 rails 但在find_by_sql
.
编辑
本地 postgres:9.0.5;heroku postgres:9.1