为什么在使用MySQL的Django中这个查询速度慢?
我有三个模型,我过滤了它们之间的关系,用一个单点和外键。以下关于我的数据库的查询大约60K行大约需要300秒完成。

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获取结果作为值列表并用作a的筛选器arg。
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。双内接头工作

最佳答案

以下代码中的前导%强制查询执行完整表扫描,而不是使用索引。如果糖果桌不适合记忆,那就要花一段时间。

WHERE `app_c`.`candy` LIKE %gummybears%

参见B-Tree Index Characteristics下的文档

10-06 03:03