PG:查詢計(jì)劃器與random_page_cost
查詢計(jì)劃器與random_page_cost
本周小貼士比較奇怪,基于我們今天遇到的一個(gè)問題。將簡訊的鏈接存儲(chǔ)到一個(gè)簡單數(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)然,這個(gè)設(shè)計(jì)比較爛。但僅供內(nèi)部使用,我只是一個(gè)粗略的想法原型。數(shù)據(jù)是一個(gè)包含json(I know, I know...)的文本,以同樣可怕的方式檢查鏈接的存在:
SELECT * FROM links WHERE data ILIKE '%whatever we want%' LIMIT 1;
在低容量下運(yùn)行很好,但查詢時(shí)間偶爾會(huì)超過300ms,很好奇這是為啥?
執(zhí)行EXPLAIN ANALYZE后,發(fā)現(xiàn)PG根本沒使用GIN索引,而是使用了全表掃描。但是如果去掉LMIT 1,查詢將使用索引,執(zhí)行只需要5ms。為什么PG會(huì)忽略索引?
PG的查詢規(guī)劃器并不是真正基于人們做一些荒唐的事情。比如使用ILIKE進(jìn)行全表掃描,關(guān)心的是走索引快還是全表掃描快。變量random_page_cost用于決定使用索引的代價(jià)是否值得,或者和seq_page_cost合作使用。
這種情況下,索引掃描是值得的,但是查詢規(guī)劃器不同意。因?yàn)榭雌饋砗芎唵蔚腖IMIT 1,只找到一個(gè)結(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ù)那個(gè)糟糕的模式”,看看PG會(huì)做什么,如果覺得索引掃描和順序掃描比代價(jià)低。因此如果最終得到的查詢使用索引,那么有必要嘗試一下,通過EXPLAIN ANALYZE分析。

發(fā)表評論
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動(dòng)更多
-
10月23日火熱報(bào)名中>> 2025是德科技創(chuàng)新技術(shù)峰會(huì)
-
10月23日立即報(bào)名>> Works With 開發(fā)者大會(huì)深圳站
-
10月24日立即參評>> 【評選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評選
-
即日-11.25立即下載>>> 費(fèi)斯托白皮書《柔性:汽車生產(chǎn)未來的關(guān)鍵》
-
11月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
-
10 大模型的盡頭是開源
- 1 特斯拉工人被故障機(jī)器人打成重傷,索賠3.6億
- 2 【行業(yè)深度研究】退居幕后四年后,張一鳴終于把算法公司變成AI公司?
- 3 人形機(jī)器人廠商,正在批量復(fù)刻宇樹G1
- 4 AI 時(shí)代,阿里云想當(dāng)“安卓” ,那誰是“蘋果”?
- 5 華為公布昇騰芯片三年計(jì)劃,自研HBM曝光
- 6 硬剛英偉達(dá)!華為發(fā)布全球最強(qiáng)算力超節(jié)點(diǎn)和集群
- 7 機(jī)器人9月大事件|3家國產(chǎn)機(jī)器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 8 谷歌“香蕉”爆火啟示:國產(chǎn)垂類AI的危機(jī)還是轉(zhuǎn)機(jī)?
- 9 00后華裔女生靠兩部AI電影狂賺7.8億人民幣,AI正式進(jìn)軍好萊塢
- 10 美光:AI Capex瘋投不止,終于要拉起存儲(chǔ)超級周期了?