Tôi đã có một cơ sở dữ liệu blog đơn giản trong postgres-8.4 có hai bảng articles
và comments
. Tôi có một truy vấn (được tạo bởi Django) muốn nhận bài viết mới nhất thuộc loại 'TIN TỨC' và cũng tìm thấy số lượng bình luận cho bài viết đó. Nó thực hiện điều đó với truy vấn sau:
SELECT "articles"."id", "articles"."datestamp", "articles"."title", "articles"."shorttitle", "articles"."description", "articles"."markdown", "articles"."body", "articles"."idxfti", "articles"."published", "articles"."type", COUNT("comments"."id") AS "comment__count"
FROM "articles"
LEFT OUTER JOIN "comments" ON ("articles"."id" = "comments"."article_id")
WHERE ("articles"."type"='NEWS')
GROUP BY "articles"."id", "articles"."datestamp", "articles"."title", "articles"."shorttitle", "articles"."description", "articles"."markdown", "articles"."body", "articles"."idxfti", "articles"."published", "articles"."type"
ORDER BY "articles"."datestamp" DESC
LIMIT 1;
Không có bảng nào trong số này đặc biệt lớn và truy vấn đó mất 46ms. Kế hoạch thực hiện là:
Limit (cost=119.54..119.58 rows=1 width=1150) (actual time=46.479..46.481 rows=1 loops=1)
-> GroupAggregate (cost=119.54..138.88 rows=455 width=1150) (actual time=46.475..46.475 rows=1 loops=1)
-> Sort (cost=119.54..120.68 rows=455 width=1150) (actual time=46.426..46.428 rows=2 loops=1)
Sort Key: articles.datestamp, articles.id, articles.title, articles.shorttitle, articles.description, articles.markdown, articles.body, articles.idxfti, articles.published, articles.type
Sort Method: quicksort Memory: 876kB
-> Hash Left Join (cost=11.34..99.45 rows=455 width=1150) (actual time=0.513..2.527 rows=566 loops=1)
Hash Cond: (articles.id = comments.article_id)
-> Seq Scan on articles (cost=0.00..78.84 rows=455 width=1146) (actual time=0.017..0.881 rows=455 loops=1)
Filter: ((type)::text = 'NEWS'::text)
-> Hash (cost=8.93..8.93 rows=193 width=8) (actual time=0.486..0.486 rows=193 loops=1)
-> Seq Scan on comments (cost=0.00..8.93 rows=193 width=8) (actual time=0.004..0.252 rows=193 loops=1)
Total runtime: 46.574 ms
Bảng bài viết có chỉ mục sau được xác định (trong số những người khác):
idx_articles_datestamp" btree (datestamp DESC) CLUSTER
Trước khi tôi phân cụm nó, việc thực hiện truy vấn phù hợp hơn với các ước tính, khoảng 119ms.
Đối với con mắt chưa được huấn luyện của tôi, có vẻ như đó là thứ chiếm nhiều thời gian nhất ở đây. Dường như cũng đang cố gắng sắp xếp trên tất cả các trường NHÓM THEO, vấn đề là nó đang cố gắng sắp xếp trên ba trường tương đối lớn body
, markdown
và idx_fti
.
Câu hỏi của tôi là: Đây có phải là một khoảng thời gian không hợp lý cho truy vấn này, hoặc có điều gì đó rõ ràng tôi đã bỏ lỡ mà tôi có thể sử dụng để tăng tốc truy vấn này không? Tất cả các truy vấn khác được yêu cầu bởi trang blog này mất khoảng 1-5ms để thực hiện, do đó, truy vấn này nổi bật như mất nhiều thời gian. Tôi đánh giá cao việc có THAM GIA NGOÀI và NGHIÊM TRỌNG, điều này không thực sự hữu ích. Tuy nhiên, tôi không phải là chuyên gia, vì vậy nếu có ai có bất kỳ đề xuất nào, điều đó sẽ vô cùng hữu ích.