基本上,我有一个包含以下内容的架构:
thread
id (uuid)
...
message
id (uuid)
thread (uuid)
time (timestamptz)
(thread) -> thread(id)
...
我经常需要根据thread
在其中发送最新消息的时间(在其他条件中)进行查询。
我已经通过message
索引了(thread, time)
,这最初起了作用,但是随着thread
数量的增加,很明显,我需要能够直接索引thread
由last_message_time
。
我当然可以在触发器的帮助下将其存储在单独的非规范化字段中,但是理想情况下,我希望避免非规范化并确保该字段是同步的。
据我所知,检查约束和生成的列不涉及子查询,所以我希望就如何最好地实现这一点寻求建议。
似乎这与外键没有本质上的不同,特别是考虑到可以重用的(thread, time)
索引,但是PostgreSQL目前似乎没有足够的表现力来做到这一点很好。
答案 0 :(得分:-1)
message(thread, time desc)
上的索引对于以下查询应是最佳的:
select distinct on (thread) m.*
from message m
order by thread, time desc;
我想不出更快的方式运行查询以获取每个线程的最新消息。