在Django PostgreSQL中排序太慢

时间:2019-02-25 05:46:52

标签: python 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;

但是在PostgreSQL中,对于150万个对象(大约六秒钟),执行速度非常慢。我以为uuid对排序过程进行了一些不必要的调整,但是具有int索引的测试模型表明不是这样。有什么解决方案(也许是postgres设置)可以加快Django PostgreSQL查询的速度?

1 个答案:

答案 0 :(得分:0)

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

  

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

这是数百万条记录中所期望的,是的。

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

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

您可以create an index on particular fields,将一些较慢的写操作换成更快的查询操作。 index will be used also when sorting with ORDER BY

如果只是想在Django模型的一个字段上创建索引一样简单,则db_index field option会指定。