gpt4 book ai didi

postgresql - 如何在 PostgreSQL 中正确计数()?

转载 作者:行者123 更新时间:2023-11-29 12:31:25 27 4
gpt4 key购买 nike

我一直在阅读有关“没有 where 子句的 COUNT(*)”在 PostgreSQL 中非常慢的信息。来自 MySQL,我不知道我是否能够在不再使用它的情况下生活。我还读到,即使你添加了一个“where”子句,它也必须从结果中扫描每一行,除非你的结果很少,否则这会很慢。我看到有疯狂的黑客使用触发器和额外的表,但我不喜欢它的外观。我的意思是我是这个 RDBMS 的新手,刚刚开始使用基本功能,并且已经不得不使用变通方法?

我需要做的一个例子是创建防洪机制。类似if "count(id) where ip = 1.2.3.4"> 100, fail instead of insert

所以我的问题是:

  • 这还是一个 Unresolved 问题吗?
  • 如果我改用 COUNT(id) 或添加一些像 DISTINCT 这样的子句,会有什么不同吗?
  • PostgreSQL 用户如何在不计算的情况下生存?

最佳答案

我认为“非常慢”是一个巨大的夸张 :) 在您的示例中,结果中最多有 100 行,计算它们将非常非常快。我很确定在这种情况下您不需要任何技巧或解决方法。

据我了解,“COUNT(*) without WHERE clause is slower in Postgres”指的是 MySQL 的 MyISAM 表存储总行数的事实表头,所以 SELECT COUNT(*) FROM my_table 是一个 O(1) 操作 - 只需从表头读取值即可。在 Postgres 中,由于 MVCC 和事务,这无法完成,它必须扫描每一行以确定它是否在当前事务中可见。

但是,如果您在查询中使用 WHERE 子句,MySQL 将无法再从标题中读取行数,而实际上必须对行数进行计数。在这种情况下,我认为 Postgres 的性能没有太大差异。

关于postgresql - 如何在 PostgreSQL 中正确计数()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137769/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com