首页 > 解决方案 > 如何有效地缓存/索引聚合子查询

问题描述

本质上,我有一个包含以下内容的架构:

thread
   id (uuid)
   ...

message
   id (uuid)
   thread (uuid)
   time (timestamptz)
   (thread) -> thread(id)
   ...

thread我经常需要根据在其中发送最新消息的时间(以及其他条件)来查询s。

我已经索引message(thread, time)which 最初有帮助,但是随着threads 数量的增加,很明显我需要能够直接索引threadby last_message_time

我当然可以将它存储在一个单独的非规范化字段中,也许在触发器的帮助下,但理想情况下我想避免非规范化并保证该字段是同步的。

据我所知,检查约束和生成的列不能涉及子查询,所以我希望就如何最好地实现这一点提供建议。

似乎这与外键并没有根本的不同,特别是考虑到(thread, time)可以重用的索引,但是似乎 PostgreSQL 目前可能没有足够的表现力来以一种好的方式做到这一点。

标签: sqlpostgresqlindexing

解决方案


上的索引message(thread, time desc)应该是查询的最佳选择,例如:

select distinct on (thread) m.*
from message m
order by thread, time desc;

我想不出一种更快的方法来运行查询以获取每个线程的最新消息。


推荐阅读