百万行Django表

2024-04-25 01:06:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目有两个应用程序(书籍和读者)。

Books应用程序有一个具有以下字段的400万行的表:

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

为了避免查询包含400万行的数据库,我考虑将其按主题划分(20个模型,20个表,200.000行)(book悻horry、book悻drammatic、ecc)。

在“reader”应用程序中,我想插入以下字段:

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

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

避免查询行数为400万的表是一个很好的解决方案吗?

有别的解决办法吗?

谢谢你


Tags: 项目id应用程序titlemodelsbookslengthmax
3条回答

ForeignKey在数据库中实现为IntegerField,因此您只需节省很少的成本就可以破坏模型。

编辑: 为了皮特的缘故,把它放在一个表中,并根据需要使用索引。

你的表现有问题吗?如果是这样,您可能需要add a few indexes

了解索引在何处有帮助的一种方法是查看db服务器的查询日志(如果您使用MySQL,则为instructions here)。

如果你没有性能问题,那就继续吧。数据库是用来处理数百万条记录的,django非常擅长生成合理的查询。

正如许多人所说,将表拆分成更小的表(水平分区甚至分片)还为时过早。数据库是用来处理这种大小的表的,所以您的性能问题可能是在其他地方。

索引是第一步,但听起来你已经做到了。400万行应该可以让数据库处理索引。

其次,检查正在运行的查询数。您可以使用类似于django调试工具栏的工具来完成这项工作,而且您经常会惊讶地发现有多少不必要的查询正在进行。

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

如果您真的需要拆分表,最新版本的django(1.2alpha)可以处理分片(例如multi-db),并且您应该能够手工编写一个水平分区解决方案(postgres提供了一种in-db的方法来实现这一点)。请不要用流派来分桌!选择一些你永远不会改变的东西,当你做一个查询的时候你会一直知道。像作者一样,用姓的第一个字母或别的什么来划分。对于一个不是特别大的数据库来说,这是一个很大的努力,也有很多缺点——这就是为什么这里的大多数人都反对它!

[编辑]

我忽略了非标准化!在eg author表中放入公共计数、总和等,以防止对公共查询进行联接。缺点是您必须自己维护它(直到django添加一个非规范化字段)。我会在开发过程中查看清楚、直接的情况,或者在缓存失败之后——但是在分片或水平分区之前很好

相关问题 更多 >