Django为OR子句生成慢查询(左外连接而不是union)

时间:2014-02-14 20:39:53

标签: mysql django performance left-join union

我有以下两个模型

class Video(models.Model):
    name = models.CharField(max_length=200)

class Store(models.Model):
    name = models.CharField(max_length=200)
    videos = models.ManyToManyField('Video')

现在我创建以下查询集并打印其查询

qs = Video.objects.filter(Q(store__name="blockbuster") | Q(pk__in=[1,2,3,4]))
print qs.query

生成以下查询。

SELECT `video`.`id`, `video`.`name`,  
FROM `video` LEFT OUTER JOIN `store` ON (`store`.`video_id` = `video`.`id`) 
WHERE (`store`.`name` = "blockbuster"  OR `video`.`id` IN (1, 2, 3, 4))

当我对此查询执行解释计划时,尽管添加了所有可能的索引,但mysql会对视频表执行全表扫描。这花了我很多钱。我如何强制mysql使用索引或强制django使用更快而不是'OR'的UNION ALL

1 个答案:

答案 0 :(得分:0)

为store_name添加索引,

name = models.CharField(max_length=200, db_index=True)

编辑:

您可以通过以下方式记录任何现有指数:

show index from video;
show index from store;