是否有可能阻止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)
作者表有超过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查询,因为这种数据库结构是高度简化的。
答案 0 :(得分:1)
该解决方案原来是删除 class Meta
选项:
class Book(models.Model):
(...)
class Meta:
ordering = ['author', 'title']