PG:查詢計(jì)劃器與random_page_cost
查詢計(jì)劃器與random_page_cost
本周小貼士比較奇怪,基于我們今天遇到的一個(gè)問題。將簡訊的鏈接存儲到一個(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í)間偶爾會超過300ms,很好奇這是為啥?
執(zhí)行EXPLAIN ANALYZE后,發(fā)現(xiàn)PG根本沒使用GIN索引,而是使用了全表掃描。但是如果去掉LMIT 1,查詢將使用索引,執(zhí)行只需要5ms。為什么PG會忽略索引?
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會做什么,如果覺得索引掃描和順序掃描比代價(jià)低。因此如果最終得到的查詢使用索引,那么有必要嘗試一下,通過EXPLAIN ANALYZE分析。

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動更多
-
6月20日立即下載>> 【白皮書】精準(zhǔn)測量 安全高效——福祿克光伏行業(yè)解決方案
-
7月3日立即報(bào)名>> 【在線會議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動力電池技術(shù)應(yīng)用大會
-
免費(fèi)參會立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會工業(yè)芯片與傳感儀表展
推薦專題
- 1 AI 眼鏡讓百萬 APP「集體失業(yè)」?
- 2 大廠紛紛入局,百度、阿里、字節(jié)搶奪Agent話語權(quán)
- 3 深度報(bào)告|中國AI產(chǎn)業(yè)正在崛起成全球力量,市場潛力和關(guān)鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級獨(dú)角獸:獲上市公司戰(zhàn)投,干人形機(jī)器人
- 5 國家數(shù)據(jù)局局長劉烈宏調(diào)研格創(chuàng)東智
- 6 一文看懂視覺語言動作模型(VLA)及其應(yīng)用
- 7 下一代入口之戰(zhàn):大廠為何紛紛押注智能體?
- 8 百億AI芯片訂單,瘋狂傾銷中東?
- 9 Robotaxi新消息密集釋放,量產(chǎn)元年誰在領(lǐng)跑?
- 10 格斗大賽出圈!人形機(jī)器人致命短板曝光:頭腦過于簡單