【发布时间】:2010-09-17 19:31:47
【问题描述】:
我正在尝试优化由 Django ORM 生成的慢查询。这是一个多对多查询。运行时间超过 1 分钟。
这些表包含大量数据,但它们并不庞大(sp_article 中的 400k 行和 sp_article_categories 中的 300k 行)
#categories.article_set.filter(post_count__lte=50)
EXPLAIN ANALYZE SELECT *
FROM "sp_article"
INNER JOIN "sp_article_categories" ON ("sp_article"."id" = "sp_article_categories"."article_id")
WHERE ("sp_article_categories"."category_id" = 1081
AND "sp_article"."post_count" <= 50 )
Nested Loop (cost=0.00..6029.01 rows=656 width=741) (actual time=0.472..25.724 rows=1266 loops=1)
-> Index Scan using sp_article_categories_category_id on sp_article_categories (cost=0.00..848.82 rows=656 width=12) (actual time=0.015..1.305 rows=1408 loops=1)
Index Cond: (category_id = 1081)
-> Index Scan using sp_article_pkey on sp_article (cost=0.00..7.88 rows=1 width=729) (actual time=0.014..0.015 rows=1 loops=1408)
Index Cond: (sp_article.id = sp_article_categories.article_id)
Filter: (sp_article.post_count <= 50)
Total runtime: 26.536 ms
我有一个索引:
sp_article_categories.article_id (type: btree)
sp_article_categories.category_id
sp_article.post_count (type: btree)
关于如何调整它以加快查询速度的任何建议?
谢谢!
【问题讨论】:
-
您真的需要结果集中两个表中的所有列吗?
-
我只是拉出这个例子中的所有列。我只测试了列的一个子集并且遇到了同样的问题......
-
减少列的nb效果不大?
标签: django postgresql