首页 > 解决方案 > 在 Django PostgreSQL 中排序太慢了

问题描述

我有两个使用一对一链接加入的 Django 模型。Django 为 ChangeList 中的排序和限制 (PER_PAGE=20) 对象生成了这个查询:

SELECT
    "test_model_object"."id", 
    "test_model_object"."sorting_field_asc", 
    "test_model_object"."sorting_field_desc", 
    ... about fifteen fields ...
    "test_model_one_to_one_element"."id", 
    "test_model_one_to_one_element"."number"

FROM "test_model_object" 

INNER JOIN "test_model_one_to_one_element" 
    ON ("test_model_object"."test_model_one_to_one_element_id" = "test_model_one_to_one_element"."id") 

ORDER BY "test_model_object"."sorting_field_asc" ASC, "test_model_object"."sorting_field_desc" DESC LIMIT 20;

但是对于 150 万个对象(大约 6 秒),PostgreSQL 的执行速度非常慢。我假设 uuid 对排序过程进行了一些不必要的调整,但具有 int 索引的测试模型表明并非如此。有什么解决方案(可能是 postgres 设置)来加速这个 Django PostgreSQL 查询?

标签: pythondjangopostgresql

解决方案


您在 PostgreSQL 表上创建了哪些索引?

PostgreSQL 中 150 万个对象的执行速度非常慢

这在数百万条记录中是可以预料的,是的。

如果您需要快速操作,这只是一个问题。PostgreSQL 和 Django 无法判断您想要快速执行哪些操作,因此默认情况下不会创建索引。

因此,因为您已经提出了这个问题,我们假设您希望该操作更快。一种方法是在写入记录时换取速度,在查询记录时换取速度。

您可以在特定字段上创建索引,以用一些较慢的写入操作换取较快的查询操作。使用 排序时也将使用ORDER BY该索引。

如果它就像想要在 Django 模型的一个字段上创建索引一样简单,那么db_indexfield 选项会指定这一点。


推荐阅读