mysql - Django 为 OR 子句生成慢查询(左外连接而不是联合)

标签 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 使用 UNION ALL 比“OR”更快?

最佳答案

为 store_name 添加索引,

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

编辑:

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

show index from video;
show index from store;

关于mysql - Django 为 OR 子句生成慢查询(左外连接而不是联合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21789129/

相关文章:

mysql - 有没有办法让月份在表格的单元格中排序

mysql - MYSQL中按类别分组的每个财政年度的期初和期末余额之和

带有问号文字的 Python 正则表达式

performance - 矢量化操作的速度取决于 data.frame 的列数

mysql - mysql 分区表上的索引

php - Docker 分离容器与耦合容器

python - Jinja2 宏导入 "with context"和全局变量 : {% from file. html import macro_name with context %}

javascript - JavaScript 的 Django 反向()

java - spring是如何管理session的?

php - Slim micro framework,为什么我无法将记录插入数据库?