为PostgreSQL数据库表提供快速/模糊计数的Django模型管理器。
django-postgres-fuzzycount的Python项目详细描述
简介
在postgresql 9.2之前,COUNT查询通常需要扫描 数据库表中的每一行。有了数百万行,这个可以变成 很慢。一种解决方法是在 PostgreSQL用于近似行计数,在许多情况下是 可接受的权衡。
给定一个名为bigdata的表,下面的查询将返回 近似行计数:
SELECT reltuples FROM pg_class WHERE relname = 'bigdata';
您可以阅读有关slow COUNT queries in PostgreSQL的更多信息 在PostgreSQL维基中。
django-postgres-fuzzycount提供的是一种使用此 直接在django模型管理器中进行。原来是 用于在kouio RSS reader中显示统计数据,这是google reader的一个流行替代品,它获得了超过500万篇新闻文章 在它发布的第一周的数据库中。
安装
安装django-postgres-fuzzycount的最简单方法是直接安装 从pypi使用pip运行以下命令:
$ pip install -U django-postgres-fuzzycount
否则,您可以直接从源代码下载并安装它:
$ python setup.py install
用法
通过在django模型上使用fuzzycount.FuzzyCountManager, 当查询时,其{TT6}$方法将返回一个近似值。 没有任何WHERE或HAVING子句的PostgreSQL表:
from django.db import models from fuzzycount import FuzzyCountManager class BigData(models.Model): big = models.BooleanField(default=True) data = models.TextField() objects = FuzzyCountManager() BigData.objects.count() # Uses fuzzycount BigData.objects.filter(id__gt=9000).count() # Doesn't use fuzzycount
fuzzycount.FuzzyCountManager还检查数据库引擎 正在使用,并且仅在使用时才应用近似计数查询 postgresql,因此可以使用其他数据库后端,其行为如下 通常(对于的不同定义,通常,取决于数据库:-)。
灵感
- postgres_loose_table_counts, a Ruby gem providing the same approach for Rails
- This Django snippet, which bakes the approach into the admin