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;
但是对于 150 万个对象(大约 6 秒),PostgreSQL 的执行速度非常慢。我假设 uuid 对排序过程进行了一些不必要的调整,但具有 int 索引的测试模型表明并非如此。有什么解决方案(可能是 postgres 设置)来加速这个 Django PostgreSQL 查询?
解决方案
您在 PostgreSQL 表上创建了哪些索引?
PostgreSQL 中 150 万个对象的执行速度非常慢
这在数百万条记录中是可以预料的,是的。
如果您需要快速操作,这只是一个问题。PostgreSQL 和 Django 无法判断您想要快速执行哪些操作,因此默认情况下不会创建索引。
因此,因为您已经提出了这个问题,我们假设您希望该操作更快。一种方法是在写入记录时换取速度,在查询记录时换取速度。
您可以在特定字段上创建索引,以用一些较慢的写入操作换取较快的查询操作。使用 排序时也将使用ORDER BY
该索引。
如果它就像想要在 Django 模型的一个字段上创建索引一样简单,那么db_index
field 选项会指定这一点。
推荐阅读
- python - Django ModuleNotFoundError:没有名为“asgiref”的模块
- ms-access - 如何在 Microsoft Access 上将多列链接到一列
- flask - 如何修复迁移 keyError 烧瓶?
- reactjs - 是否可以为 Reactjs 应用程序的单个组件及其所有依赖文件和插件(如构建版本)创建一个 js 文件
- sql-server - 连接到 SQL Server(Postgresql 数据库):使用什么作为主机名?
- sql - 简单案例语句返回 ORA-00937:不是单组组函数
- mysql - Spring - 无法使用 CRUD 存储库保存实体
- matplotlib - 不能使用 matplotlib 库?
- android - 为什么我不能在另一个文本视图上方添加一个文本视图?
- ios - 应用程序启动时如何处理 url?