count()是计算对象数量的最有效方法吗?

时间:2018-10-17 17:43:17

标签: python django postgresql count

我需要计算数据库中特定模型的对象数量,并使用上下文处理器显示该数量,以供用户在每个页面上查看。

现在,我只是在做Model.objects.count()。它可以工作,但是由于数据库中现在有超过40万个对象,因此它的运行速度明显降低。

我正在开发服务器上运行,所以也许一旦我推到专用服务器上就不会有问题,但是我不确定...我担心一旦我们成千上万的人会发生什么或更高。有提示吗?

1 个答案:

答案 0 :(得分:0)

如果您从pg_class.reltuples得到的估算值足够好,那就去做。那将是最简单的解决方案。

如果您需要准确的数字,则可以使用触发器来实现。以下示例在mytab中保留表mytab_count的计数:

CREATE TABLE mytab_count (
   c bigint NOT NULL
);  

-- make sure there cannot be more than one row
CREATE UNIQUE INDEX mytab_count_singleton
   ON mytab_count ((1));

INSERT INTO mytab_count
   SELECT count(*) FROM mytab;

CREATE OR REPLACE FUNCTION count_trig() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   CASE TG_OP
      WHEN 'INSERT' THEN
         UPDATE mytab_count SET c = c + 1;
         RETURN NEW;
      WHEN 'DELETE' THEN
         UPDATE mytab_count SET c = c - 1;
         RETURN OLD;
   END CASE;
END;$$;

CREATE TRIGGER count_trig AFTER INSERT OR DELETE ON mytab
   FOR EACH ROW EXECUTE PROCEDURE count_trig();