我需要计算数据库中特定模型的对象数量,并使用上下文处理器显示该数量,以供用户在每个页面上查看。
现在,我只是在做Model.objects.count()
。它可以工作,但是由于数据库中现在有超过40万个对象,因此它的运行速度明显降低。
我正在开发服务器上运行,所以也许一旦我推到专用服务器上就不会有问题,但是我不确定...我担心一旦我们成千上万的人会发生什么或更高。有提示吗?
答案 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();