2
为什么这个查询在Django使用MySQL缓慢? 我有三个模型,我正在过滤,与OneToOne和ForeignKey彼此相关。以下查询在我的数据库中大约有60k行需要大约300秒才能完成。Django的双内部连接与MySQL缓慢
resutls = A.objects.filter(b__c__candy__icontains="gummybears")
results # <-- 300 seconds
在应用程序的模型:
class A(models.Model):
b = models.OneToOneField(B, default=None)
a_charfield = models.CharField(max_length=40, default='')
class B(models.Model):
b_charfield = models.CharField(max_length=40, default='')
primary_id = models.CharField(max_length=40, unique=True, primary_key=True, default='', null=False)
class C(models.Model):
b = models.ForeignKey('B')
candy = models.CharField(db_index=True, max_length=40, default='')
打印result.query显示MySQL查询为(我的组合列名*):我有两个工作
SELECT *
FROM `app_a`
INNER JOIN `app_b` ON (`app_a`.`b_id` = `app_b`.`primary_id`)
INNER JOIN `app_c` ON (`app_b`.`primary_id` = `app_c`.`b_id`)
WHERE `app_c`.`candy` LIKE %gummybears%
ORDER BY `app_a`.`id` DESC
解决方案。
得到B的结果作为values_list并作为过滤器使用arg至A. https://docs.djangoproject.com/en/dev/ref/models/querysets/#in性能考虑
resutls = A.objects.filter(b__in=list(B.objects.filter(c__c_charfield__icontains="candy").values_list('pk', flat=True))
- 切换到PostgreSQL。双内连接工作< 1秒
使用情况下的文档还'select_related()' – catherine 2013-04-04 02:03:38
你能运行使用MySQL错误的解释?也许你错过了其中一个外键的索引? – Arjen 2013-05-18 10:07:02