gpt4 book ai didi

django - Postgresql 即使有索引也慢连接?

转载 作者:行者123 更新时间:2023-11-29 13:04:22 26 4
gpt4 key购买 nike

我想弄清楚为什么特定的 SQL 查询在 postgres 上运行缓慢。无需过多解释,以下是查询的解释分析:

explain analyze SELECT "addressbooks_address"."id", "addressbooks_address"."name" FROM "addressbooks_recipientaddress" INNER JOIN"addressbooks_address" ON ("addressbooks_recipientaddress"."address_ptr_id" = "addressbooks_address"."id") ORDER BY "addressbooks_recipientaddress"."address_ptr_id" ASC LIMIT 1000 OFFSET 378000;

QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=40139.55..40245.42 rows=1000 width=21) (actual time=720.444..721.958 rows=1000 loops=1)
-> Merge Join (cost=121.88..67152.43 rows=633159 width=21) (actual time=0.028..698.069 rows=379000 loops=1)
Merge Cond: (addressbooks_recipientaddress.address_ptr_id = addressbooks_address.id)
-> Index Scan using addressbooks_recipientaddress_pkey on addressbooks_recipientaddress (cost=0.00..19258.72 rows=633159 width=4) (actual time=0.012..189.480 rows=379000 loops=1)
-> Index Scan using addressbooks_address_pkey on addressbooks_address (cost=0.00..38291.65 rows=675743 width=17) (actual time=0.011..227.094 rows=388264 loops=1)
Total runtime: 722.092 ms

查询由 django 生成,但我在将其发布到此处之前对其进行了一些简化。但问题仍然存在。我有 addressbooks_address.id 和 addressbooks_recipientaddress.address_ptr_id 的索引,如 explain 所示。

有什么想法吗?

最佳答案

LIMIT 1000 OFFSET 378000

快速查看您正在做的事情;您正在生成一个相当大的连接,然后将其中的绝大部分丢弃。

不要使用 OFFSET,如果可能的话,请尝试通过感兴趣的行的主键进行分页。记住 addressbooks_address.id 以及 addressbooks_recipientaddress 的键来自先前结果中的最后一个元组,并使用如下 WHERE 子句:

WHERE "addressbooks_recipientaddress"."id" > $1
AND "addressbooks_address"."id" > $2

而不是 OFFSET。这样您的索引扫描就可以直接跳到那些记录,而不是浪费所有时间生成要丢弃的结果。

如果您的框架不能做到这一点,那么,这就是我不喜欢查询生成器框架的原因。

关于django - Postgresql 即使有索引也慢连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18650749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com