查詢計畫器與random page cost

2021-10-21 02:42:38 字數 631 閱讀 6457

create table links (

uid char(60) primary key,

data text,

timestamp int

create index idx_trgm on links using gin (data gin_trgm_ops)

select * from links where data ilike '%whatever we want%' limit 1;

在低容量下執行很好,但查詢時間偶爾會超過300ms,很好奇這是為啥?

執行explain analyze後,發現pg根本沒使用gin索引,而是使用了全表掃瞄。但是如果去掉lmit 1,查詢將使用索引,執行只需要5ms。為什麼pg會忽略索引?

pg的查詢規劃器並不是真正基於人們做一些荒唐的事情。比如使用ilike進行全表掃瞄,關心的是走索引快還是全表掃瞄快。變數random_page_cost用於決定使用索引的代價是否值得,或者和seq_page_cost合作使用。

這種情況下,索引掃瞄是值得的,但是查詢規劃器不同意。因為看起來很簡單的limit 1,只找到乙個結果就可以停止。並繼續進行全表掃瞄。

set random_page_cost = 1;

exp

mysql 查詢計畫 rows 查詢計畫引數詳解

explain這是這次想要了解的重點命令,用於檢視mysql中查詢sql語句的執行計畫,用來對sql進行優化,以最合理的方式寫sql語句 一條標準的sql查詢語句 explain select id from user customer where id 1 g 得到的結果 1.row id 1 s...

sql server 查詢計畫

在你的執行sql 語句之前加上 下面這句話 就可以列出相應的執行計畫 set statistics profile on 執行計畫簡單說明 rows 表示在乙個執行步驟中,所產生的記錄條數。真實資料,非預期 executes 表示某個執行步驟被執行的次數。真實資料,非預期 stmt text 表示要...

查詢計畫參考

一 官方 二 語句 all 最慢,全表 possible keys 可能用到的索引 key 實際用到的索引 key len key長度,位元組 ref 該 ref列顯示將哪些列或常量與該 key列中 命名的索引進行比較,以 從表中選擇行 一般顯示const或者外來鍵關聯的字段 row 預估的記錄數量...