postgresql - 使用物化视图更快地从大型表中检索数据
问题描述
我们有一个表来存储用户登录的日志user_login_log。每次用户登录时,此表都会收到一条记录。
我们有一个用例来获取每个用户的最后登录时间戳,并且将经常获取此数据。要求是应快速加载此数据。
要求
- 应该快速加载数据。
- 数据不应过时。
日志表可以有数万条记录,因此每次查询它们将是一个缓慢的过程。我们提出了两种快速检索数据的方法。
方法1:我们最初的想法是使用物化视图。
这种方法的问题是,随着user_login_log表中数据的增加,刷新物化视图的查询会变慢,从而使 INSERT、UPDATE 和 DELETE 操作变慢。
方法2:另一个想法是使用专用的快照表来存储最新的登录数据。
然后将直接从快照表中检索数据。这种方法的问题是我们将在两个表中维护相同的数据,而触发器函数将负责维护数据完整性。
这些方法中哪一种更适合我们的用例?是否有任何其他方法可以更有效地过滤和检索所需数据?
解决方案
您的第一种方法没有多大意义。为什么要构建一个触发器,它具有您需要的确切信息,只是为了丢弃这些信息并让它从头开始重建整个表?是的,当然这会很慢。
在您的第二种方法中,为什么要创建第二张表来保存一列信息?你不是已经有一个可以添加列的“app_user”表吗?
这种方法的问题是我们将在两个表中维护相同的数据,而触发器函数将负责维护数据完整性。
我看不出这有什么问题。这不是触发器的用途吗?只需正确编码,并确保用户登录事件在其自己的事务中,以避免将记录锁定过多的时间。
另一种选择是编写递归 CTE 代码,对现有的 user_login_log 表进行松散索引扫描。这可能足够快以避免在写入时必须做任何特殊的事情。
推荐阅读
- python - 控制器调用的框架中的绑定列表
- c++ - 提升测试:自定义 << 运算符用于 std::vector
类型? - android - 如何在 android 的 EditText 中使用 sinhala unicode 提供建议
- reactjs - 根据 React Web 应用程序中的状态呈现 if 语句
- java - 致命例外:Firebase-Messaging-Intent-Handle 进程:com.google.android.youtube 在预启动 google play 控制台上
- c++ - 如何在 clang 格式的函数参数包装和对齐上强加我自己的自定义样式?
- jenkins - 我可以在 Jenkins 中有主节点的同一台机器上创建一个从节点吗?
- c - 矩阵中的行数和列数
- java - 为什么 jvm -XX:+EliminateAllocations 失败
- node.js - Node.js、multer、express、sequelize、Postgres