sql - 在不必要时防止 Django 模型调用中的慢速 INNER JOIN

标签 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)

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/

相关文章:

python - Winzip 无法在 Windows 上打开由 python shutdown.make_archive 创建的存档。在 ubuntu 上存档管理器运行良好

postgresql - 我如何使用 postgres crate 从 PostgreSQL 接收表修改事件?

database - PostgreSQL 性能问题

sql - 不同步时如何重置 Postgres 的主键序列?

php - 从表中删除条目并存储已删除条目中的值

sql - T-SQL PIVOT 在一列上附加其他列

python - Django 模板反向 url 解析而不为变量创建组

sql - 检查数据库中是否存在记录时出现 Linq To Entity 错误

mysql - 我如何计算 django 中这些条目的平均分数?

postgresql - 你如何更改 PostgreSQL 中的用户?