Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Django生成OR子句的慢速查询(左外部联接而不是union)_Mysql_Django_Performance_Left Join_Union - Fatal编程技术网

Mysql Django生成OR子句的慢速查询(左外部联接而不是union)

Mysql Django生成OR子句的慢速查询(左外部联接而不是union),mysql,django,performance,left-join,union,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_

我有以下两种型号

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使用UNION ALL,这比“or”更快呢

为商店名称添加索引

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

您可以通过以下方式记录任何现有索引:

show index from video;
show index from store;

您是否考虑过获取两个单独的集合,然后删除冲突,而不是使用Q | Q?OP说他有索引,但MySQL显然没有使用它们。