在不必要的情况下,防止Django模型调用中的INNER JOIN缓慢

时间:2014-06-11 15:19:19

标签: sql django postgresql

是否有可能阻止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查询,因为这种数据库结构是高度简化的。

1 个答案:

答案 0 :(得分:1)

该解决方案原来是删除 class Meta选项:

class Book(models.Model):

    (...)

    class Meta:
        ordering = ['author', 'title']