Django,如何实现将在每个查询中过滤的字段

时间:2011-12-04 19:27:51

标签: django performance filter indexing

我有一个django模型,其中包含具有以下属性的字段:

  • 现在使用CharField实现,max_length = 1
  • 字段是枚举,有4个选项A,B,C,D
  • 90%的物体具有值A,其余部分均为B,C,D
  • 在90%的查询中,B,C,D将被过滤掉,仅显示具有A
  • 的对象
  • 可能会有10000-50000个对象
  • 通过一些更新和创建新对象来加载95%读数
  • 此模型是我的应用程序的核心,因此几乎所有页面都有列表或详细信息视图。

因此,90%的时间我过滤掉相同的10%的对象(+无论查询在此基本过滤之上做什么,都要让我显示10-100个对象)。在django这样做表现最好的方法是什么? (优化一个查询可能不值得付出努力,但不知何故,始终以相同的方式过滤数据似乎很浪费......)

  • 只需使用filter()?过滤A可能是次要成本,假设在区分A和其他对象之前,查询优化将丢弃大量对象
  • 过滤器+字段索引?
  • 过滤器+索引+实现具有某些特定数据类型的字段,以使索引工作更好?什么类型是理想的?
  • 多表继承与虚拟基础+ A(基础),B(基础),......?对象的处理方式相同,但子类表不需要对该字段进行过滤。
  • 别的什么?

DB是带有InnoDB表的MySql。我打算用虚拟数据进行测试来比较实现,但我希望得到任何反馈和相关信息的链接。查看代码为每个对象添加了依赖于用户/配置文件的内容(即用户可能给出的评级),所以我不确定我可以缓存多少。

2 个答案:

答案 0 :(得分:0)

我认为在缓慢之前你不应该优化任何东西。对于这个大小的数据,我将尝试使用filter + index字段。我不知道你每秒有多少请求。 如果它不够快,使用单独表格的想法看起来合理。 您也可以尝试使用一种缓存,按键(A,B,C,D)分割数据。 但我的建议是使用简单的解决方案,直到它不被接受为止。

答案 1 :(得分:0)

这个问题有两个部分:在效率方面哪些更好,以及如何编写代码。

就效率而言,除了确保数据库索引包含您要过滤的字段之外,没有必要做任何事情。您可能需要手动执行至少其中一些操作:使用类似django-debug-toolbar的内容来显示查询,并创建这些查询所需的复合索引。

对于代码,最好的办法是使用仅过滤A对象的方法创建custom manager

class MyManager(models.Manager):
    def only_as(self):
        return self.filter(myfield='A')

...

MyModel.objects.only_as().filter(whatever=whatever)