如何有效地缓存/索引聚合子查询

时间:2020-10-01 09:43:17

标签: sql postgresql indexing

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

thread
   id (uuid)
   ...

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

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

我已经通过message索引了(thread, time),这最初起了作用,但是随着thread数量的增加,很明显,我需要能够直接索引threadlast_message_time

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

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

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

1 个答案:

答案 0 :(得分:-1)

message(thread, time desc)上的索引对于以下查询应是最佳的:

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

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