以获得更好的分页性能,而不是在postgresql中这样做:
SELECT * FROM message ORDER BY created_at DESC limit 30 offset 30;
我可以将ID存储在redis排序集中,然后通过以下方式简单地从redis获取ID:
ZREVRANGE message_ids 30 39
然后在postgresql中查询那些ID以获取值。
之所以我不直接在Redis中存储价值,是因为价值可能很大,而RAM却很昂贵。 (我没有足够的RAM)。
如果建议这样做或可以提高性能,可以如何通过ID从Postgresql中正确查询值?
我发现了以下几种方法,不确定是否是最好的方法:
SELECT m.*
FROM unnest('{17579, 17580, 17582}'::int[]) id
JOIN message m USING (id);
或者简单地:
SELECT * FROM message WHERE id IN (17579, 17580, 17582);
上面的查询来自此link
顺便说一句,我也不确定上述命令是否会根据ID列表的顺序以及我是否最终需要ORDER BY id
给我正确的顺序。
总而言之,这个redis + postgresql解决方案会比仅postgresql解决方案快得多吗?
答案 0 :(得分:2)
总而言之,这个redis + postgresql解决方案会比 唯一的postgresql解决方案?
我认为,最终结果不值得您引入系统的工作量/复杂性。
数据库为此类查询提供了非常好的性能,只要您为要查询的字段建立索引并仅选择所需的字段即可。
在您提出的解决方案中,当应用程序尝试提供页面(它是Web应用程序,对吗?)时,将会发生以下情况:
相比之下,如果我们选择简单的方法,则只有一个SQL查询被发送到数据库。
与此同时,还要考虑在确保Redis中提供的ID与数据库服务器保持一致方面所涉及的开发工作。
也就是说,如果您的数据库服务器承受着沉重的负担,并且您需要减轻一些负担,那么您可以考虑将elasticsearch / solr包含在应用程序堆栈中。
您还可以考虑为postgresql设置复制,以分配只有一台数据库服务器可能无法处理的负载。