在 Django 模型中索引外键
Index a foreign key in Django Models
我想在涉及 CharField 和 ForeignKey 的项目中为一个非常常见的查询建立索引。我有这个查询的瓶颈,我正在尝试优化它。我有这个:
class Bill(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
category = models.CharField(max_length=200, null=True, blank=True)
...
我添加这个是为了提高性能:
class Meta:
indexes = [
models.Index(fields=['category', 'company']),
]
但是结果是一样的,查询是:
models.Bill.objects.filter(company=company, category='recibida')
还有什么我可以改进的地方吗?这个索引做得好吗?
您创建的索引有效,但您可能不需要。它创建了两个字段的组合索引,并且只有在您有一个也使用了这两个字段的查询时才会使用。
如果您的查询一次只访问其中一个字段,更好的方法是在每个字段后添加 db_index=True
。
但是,请记住,为查询找到最佳索引在很大程度上取决于您的上下文,最好的方法是使用 SQL EXPLAIN,例如用 django-debug-toolbar 找到它。
我想在涉及 CharField 和 ForeignKey 的项目中为一个非常常见的查询建立索引。我有这个查询的瓶颈,我正在尝试优化它。我有这个:
class Bill(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
category = models.CharField(max_length=200, null=True, blank=True)
...
我添加这个是为了提高性能:
class Meta:
indexes = [
models.Index(fields=['category', 'company']),
]
但是结果是一样的,查询是:
models.Bill.objects.filter(company=company, category='recibida')
还有什么我可以改进的地方吗?这个索引做得好吗?
您创建的索引有效,但您可能不需要。它创建了两个字段的组合索引,并且只有在您有一个也使用了这两个字段的查询时才会使用。
如果您的查询一次只访问其中一个字段,更好的方法是在每个字段后添加 db_index=True
。
但是,请记住,为查询找到最佳索引在很大程度上取决于您的上下文,最好的方法是使用 SQL EXPLAIN,例如用 django-debug-toolbar 找到它。