Django表与百万行

时间:2010-01-12 18:47:31

标签: python django django-models django-database

我有一个包含2个应用程序(书籍和读者)的项目。

图书应用程序有一个包含4百万行的表格,其中包含以下字段:

 book_title = models.CharField(max_length=40)
 book_description = models.CharField(max_length=400)

为了避免用4百万行查询数据库,我想按主题划分它(20个模型,20个表,200,000行(book_horror,book_drammatic,ecc)。

在“阅读器”应用程序中,我想插入这些字段:

reader_name = models.CharField(max_length=20, blank=True)
book_subject = models.IntegerField()
book_id = models.IntegerField()

因此,我想使用整数“book_subject”(允许访问相应的表)和“book_id”(允许访问“book_subject”中指定的表中的书)。而不是ForeignKey。

避免查询包含4百万行的表是一个很好的解决方案吗?

有替代解决方案吗?

谢谢^ __ ^

6 个答案:

答案 0 :(得分:12)

正如许多人所说的那样,将表分成较小的表(水平分区甚至分片)还为时过早。数据库用于处理此大小的表,因此您的性能问题可能在其他地方。

索引是第一步,听起来你已经这样做了。数据库可以使用索引来处理400万行。

其次,检查您正在运行的查询数。您可以使用django调试工具栏之类的东西来执行此操作,并且您经常会惊讶地发现了多少不必要的查询。

缓存是下一步,对大多数用户未更改的页面或部分页面使用memcached。在这里,您可以看到最大的性能提升所需的努力。

如果你真的需要拆分表,最新版本的django(1.2 alpha)可以处理分片(例如multi-db),你应​​该能够手写一个水平分区解决方案(postgres提供了一个in-db方式来做到这一点)。请不要使用流派来分割表格!选择一些你永远不会改变的东西,并且你在查询时总会知道。像作者一样,除以姓氏的第一个字母或其他东西。这是一项很大的努力,并且对于数据库来说有很多缺点,这个数据并不是特别大 - 这就是为什么大多数人都在建议反对它!

[edit]

我遗漏了非规范化!在例如作者表中放置常用计数,总和等,以防止对常见查询进行连接。缺点是你必须自己维护它(直到django添加一个DenormalizedField)。我会在开发过程中看到这个明确,直截了当的情况,或者在缓存失败之后 - 但在分片或水平分区之前

答案 1 :(得分:10)

ForeignKey在数据库中实现为IntegerField,因此您可以以牺牲模型为代价来节省很少的成本。

修改 为了皮特的缘故,将它保存在一个表中并根据需要使用索引。

答案 2 :(得分:1)

您是否遇到性能问题?如果是这样,您可能需要add a few indexes

了解索引有用的一种方法是查看数据库服务器的查询日志(instructions here,如果您使用的是MySQL)。

如果您没有遇到性能问题,那就去吧。数据库用于处理数百万条记录,而django非常擅长生成合理的查询。

答案 3 :(得分:1)

解决此类问题的常见方法是Sharding。不幸的是,主要由ORM来实现它(Hibernate做得非常好)而且Django不支持这个。但是,我不确定400万行真的那么糟糕。您的查询仍应完全可管理。

也许您应该使用memcached这样的内容进行缓存。 Django supports this非常好。

答案 4 :(得分:1)

您还没有提到您正在使用的数据库。一些数据库 - 比如MySQL和PostgreSQL--具有开箱即用的非常保守的设置,除了小型服务器上的小型数据库之外,它们基本上无法使用。

如果您告诉我们您正在使用哪个数据库,以及它正在运行的硬件,以及该硬件是否与其他应用程序共享(例如,它是否也在为Web应用程序提供服务),那么我们可能会给您一些具体的调整建议。

例如,使用MySQL,您可能需要调整InnoDB设置;对于PostgreSQL,您需要更改shared_buffers和许多其他设置。

答案 5 :(得分:0)

我不熟悉Django,但我对DB有一般的了解。

当您拥有大型数据库时,index your database非常正常。这样,检索数据应该非常快。

在将图书与读者联系起来时,您应该创建另一个表格,将读者与书籍联系起来。

将书籍分成科目并不是一个坏主意。但我不确定你有20个申请是什么意思。