是否可以防止 Django 在不必要时在 SQL 关系查询中使用 INNER JOIN?
我有两个表:
class Author(models.Model):
name = models.CharField(max_length=50, primary_key=True, db_index=True)
hometown = models.CharField(max_length=50)
class Book(models.Model):
title = models.CharField(max_length=50, primary_key=True, db_index=True)
author = models.ForeignKey(Author, db_index=True)
author 表有超过 5000 万行,这使得获取一位作者的所有书籍 Book.objects.filter(author_id='John Smith')
的请求非常慢(大约20 秒)。但是,当我使用原始 SQL 获得相同结果时,查询几乎是即时的:SELECT * FROM books WHERE author_id='John Smith';
。
使用 result.query 我发现 Django 比较慢,因为它在整个表上运行 INNER JOIN 查询:
SELECT books.title, books.author_id FROM books INNER JOIN authors
ON (books.author_id = authors.name) WHERE books.author_id = 'John Smith';
有没有办法让 Django 在没有必要的情况下避免 INNER JOIN?
我希望尽可能避免使用原始 SQL 查询,因为此数据库结构已高度简化。
最佳答案
解决方案原来是删除一个class Meta
选项:
class Book(models.Model):
(...)
class Meta:
ordering = ['author', 'title']
关于sql - 在不必要时防止 Django 模型调用中的慢速 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24166668/