我有一个带有Postgres 9.3后端的Django 1.7应用程序。我的数据库有大约400万行支出项目,每个项目都有一个关联的组织。模型如下:
class Organisation(models.Model):
code = models.CharField(max_length=9, primary_key=True, db_index=True)
name = models.CharField(max_length=200)
class SpendingItem(models.Model):
organisation = models.ForeignKey(Organisation)
total_items = models.IntegerField() ... plus other info attached
我现在正在为每个组织编写一个视图,该视图返回附加的支出项目总数。对于大的结果集,它非常慢,例如返回1m结果的查询超过150秒。
这是视图代码:
def organisation(request, org_code):
org = get_object_or_404(Organisation, code=org_code)
num_spending_items = SpendingItem.objects.filter(organisation=org).count()
context = {
'organisation': org,
'num_spending_items': num_spending_items
}
return render(request, 'organisation.html', context)
我一直在阅读Postgres documentation on slow counting,但我想知道我能做些什么简单,例如使用索引加快速度,或者我是否需要回退到原始SQL并使用文档中提到的一些技术。或预先生成结果并将其存储在其他地方。
我的消费项目数据库表已经有以下索引,虽然我一直在用COPY
语句加载数据,所以我不知道它们是否是最新的(并且不知道我是怎么说的):
=# \d frontend_spendingitem;
Table "public.frontend_spendingitem"
Column | Type | Modifiers
-------------------+-------------------------+--------------------------------------------------------------------
id | integer | not null default nextval('frontend_spendingitem_id_seq'::regclass)
total_items | integer | not null
organisation_id | character varying(9) | not null
Indexes:
"frontend_spendingitem_pkey" PRIMARY KEY, btree (id)
"frontend_spendingitem_a69d813a" btree (organisation_id)
"frontend_spendingitem_organisation_id_4619f68f65c49a8_like" btree (organisation_id varchar_pattern_ops)
Foreign-key constraints:
"front_organisation_id_4619f68f65c49a8_fk_frontend_organisation_code" FOREIGN KEY (organisation_id) REFERENCES frontend_organisation(code) DEFERRABLE INITIALLY DEFERRED