PG:查詢計劃器與random_page_cost
查詢計劃器與random_page_cost
本周小貼士比較奇怪,基于我們今天遇到的一個問題。將簡訊的鏈接存儲到一個簡單數(shù)據(jù)庫中:
CREATE TABLE links (
uid CHAR(60) PRIMARY KEY,
data TEXT,
timestamp INT
)
CREATE INDEX idx_trgm ON links USING GIN (data gin_trgm_ops)
當(dāng)然,這個設(shè)計比較爛。但僅供內(nèi)部使用,我只是一個粗略的想法原型。數(shù)據(jù)是一個包含json(I know, I know...)的文本,以同樣可怕的方式檢查鏈接的存在:
SELECT * FROM links WHERE data ILIKE '%whatever we want%' LIMIT 1;
在低容量下運行很好,但查詢時間偶爾會超過300ms,很好奇這是為啥?
執(zhí)行EXPLAIN ANALYZE后,發(fā)現(xiàn)PG根本沒使用GIN索引,而是使用了全表掃描。但是如果去掉LMIT 1,查詢將使用索引,執(zhí)行只需要5ms。為什么PG會忽略索引?
PG的查詢規(guī)劃器并不是真正基于人們做一些荒唐的事情。比如使用ILIKE進(jìn)行全表掃描,關(guān)心的是走索引快還是全表掃描快。變量random_page_cost用于決定使用索引的代價是否值得,或者和seq_page_cost合作使用。
這種情況下,索引掃描是值得的,但是查詢規(guī)劃器不同意。因為看起來很簡單的LIMIT 1,只找到一個結(jié)果就可以停止。并繼續(xù)進(jìn)行全表掃描。
SET random_page_cost = 1;
EXPLAIN ANALYZE SELECT * ... LIMIT 1;
[see the index being used]
SET random_page_cost = DEFAULT;
EXPLAIN ANALYZE SELECT * ... LIMIT 1;
[see the index NOT being used]
除了明顯的“修復(fù)那個糟糕的模式”,看看PG會做什么,如果覺得索引掃描和順序掃描比代價低。因此如果最終得到的查詢使用索引,那么有必要嘗試一下,通過EXPLAIN ANALYZE分析。

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-9.16點擊進(jìn)入 >> 【限時福利】TE 2025國際物聯(lián)網(wǎng)展·深圳站
-
10月23日火熱報名中>> 2025是德科技創(chuàng)新技術(shù)峰會
-
10月23日立即報名>> Works With 開發(fā)者大會深圳站
-
10月24日立即參評>> 【評選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評選
-
11月27日立即報名>> 【工程師系列】汽車電子技術(shù)在線大會
-
12月18日立即報名>> 【線下會議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
推薦專題
- 1 先進(jìn)算力新選擇 | 2025華為算力場景發(fā)布會暨北京xPN伙伴大會成功舉辦
- 2 人形機(jī)器人,正狂奔在批量交付的曠野
- 3 宇樹機(jī)器人撞人事件的深度剖析:六維力傳感器如何成為人機(jī)安全的關(guān)鍵屏障
- 4 解碼特斯拉新AI芯片戰(zhàn)略 :從Dojo到AI5和AI6推理引擎
- 5 AI版“四萬億刺激”計劃來了
- 6 騰訊 Q2 財報亮眼:AI 已成第二增長曲線
- 7 2025年8月人工智能投融資觀察
- 8 9 Manus跑路,大廠掉線,只能靠DeepSeek了
- 10 a16z最新AI百強(qiáng)榜:硅谷頂級VC帶你讀懂全球生成式AI賽道最新趨勢