我有兩個表。新聞表有7m記錄,news_publish表有70m記錄 當我執行這個查詢花費了大量的時間並且很慢。 我增加了三個索引進行調整,但查詢速度很慢。 當我谷歌這個問題,我發現有人建議改變統計到1000,我恰克它,但問題是還沒有postgresql日期提交查詢性能
alter table khb_news alter submitteddate set statistics 1000;
SELECT n.id as newsid ,n.title,p.submitteddate as publishdate,
n.summary ,n.smallImageid ,
n.classification ,n.submitteddate as newsdate,
p.toorganizationid
from khb_news n
join khb_news_publish p
on n.id=p.newsid
left join dataitem b on b.id=n.classification
where
n.classification in (1) and n.newstype=60
AND n.submitteddate >= '2014/06/01'::timestamp AND n.submitteddate <'2014/08/01'::timestamp and p.toorganizationid=123123
order by p.id desc
limit 10 offset 0
指標是:
CREATE INDEX "p.id"
ON khb_news_publish
USING btree
(id DESC);
CREATE INDEX idx_toorganization
ON khb_news_publish
USING btree
(toorganizationid);
CREATE INDEX "idx_n.classification_n.newstype_n.submitteddate"
ON khb_news
USING btree
(classification, newstype, submitteddate);
後添加此指標和運行講解分析我得到這個解釋
"Limit (cost=0.99..10100.13 rows=10 width=284) (actual time=24711.831..24712.849 rows=10 loops=1)"
" -> Nested Loop (cost=0.99..5946373.12 rows=5888 width=284) (actual time=24711.827..24712.837 rows=10 loops=1)"
" -> Index Scan using "p.id" on khb_news_publish p (cost=0.56..4748906.31 rows=380294 width=32) (actual time=2.068..23338.731 rows=194209 loops=1)"
" Filter: (toorganizationid = 95607)"
" Rows Removed by Filter: 36333074"
" -> Index Scan using khb_news_pkey on khb_news n (cost=0.43..3.14 rows=1 width=260) (actual time=0.006..0.006 rows=0 loops=194209)"
" Index Cond: (id = p.newsid)"
" Filter: ((submitteddate >= '2014-06-01 00:00:00'::timestamp without time zone) AND (submitteddate < '2014-08-01 00:00:00'::timestamp without time zone) AND (newstype = 60) AND (classification = ANY ('{19,20,21}'::bigint[])))"
" Rows Removed by Filter: 1"
"Planning time: 3.871 ms"
"Execution time: 24712.982 ms"
我加入解釋 如何更改查詢以使其更快?
請修正,使其與解釋格式將工作與工具,如https://explain.depesz.com –
我改變它我添加解釋在https://explain.depesz.com/s/Gym –
CREATE INDEX「p.id」ON khb_news_publish USING btree(id DESC);'恕我直言,這應該是一個主鍵(這將執行一個**唯一**索引)。與其他表類似:首先限制PK + FK,而不是爲FK添加支持索引,而不是爲其他候選鍵添加唯一索引,而不是添加一些附加索引來支持典型查詢。 – wildplasser