sql - 如何有效地缓存/索引聚合子查询
问题描述
本质上,我有一个包含以下内容的架构:
thread
id (uuid)
...
message
id (uuid)
thread (uuid)
time (timestamptz)
(thread) -> thread(id)
...
thread
我经常需要根据在其中发送最新消息的时间(以及其他条件)来查询s。
我已经索引message
了(thread, time)
which 最初有帮助,但是随着thread
s 数量的增加,很明显我需要能够直接索引thread
by last_message_time
。
我当然可以将它存储在一个单独的非规范化字段中,也许在触发器的帮助下,但理想情况下我想避免非规范化并保证该字段是同步的。
据我所知,检查约束和生成的列不能涉及子查询,所以我希望就如何最好地实现这一点提供建议。
似乎这与外键并没有根本的不同,特别是考虑到(thread, time)
可以重用的索引,但是似乎 PostgreSQL 目前可能没有足够的表现力来以一种好的方式做到这一点。
解决方案
上的索引message(thread, time desc)
应该是查询的最佳选择,例如:
select distinct on (thread) m.*
from message m
order by thread, time desc;
我想不出一种更快的方法来运行查询以获取每个线程的最新消息。
推荐阅读
- python - 如何在python中将数据模拟为request.Response类型
- shell - 如果在执行“sed -i --”时出错会发生什么情况,这是文件的更改
- highcharts - HighCharts navigator: how to disable the expand width icon on hover
- python - ggplot 到 R - 数据框 R
- file - 当 Folder.Files 返回不存在的文件夹时处理
- perl - 从 ip 命令获取 inet 的 Perl 脚本
- angular - *ngFor 停止在 IE 11 / Angular 4 上工作
- android - 依赖项顺序是否会在应用程序中进行任何更改?
- laravel - 在 Laravel 中使用数组过滤产品
- javascript - Firefox中图像加载缓慢