"Index"
- Index(索引)
看到執行計畫寫著走索引或建索引、想知道那是什麼時
- Sargable(可走索引的條件形狀)
索引存在而計畫仍走全表掃描時,查條件的寫法有沒有擋住那個索引
- PostgreSQL Index Selection:B-tree / GIN / GiST / BRIN / Hash 對應 workload 的決策樹
PG 有 6 種 index method(B-tree / Hash / GIN / GiST / SP-GiST / BRIN)跟 partial / expression / covering 三種變體、不是「都用 B-tree 就好」。每種 index 有自己的 query pattern、儲存代價、write amplification 跟 maintenance 成本。本文走 6 種 index 的適用 workload 對照、決策樹、partial / expression / covering / multi-column 變體、5 production 踩雷(過度 index / partial 條件不對 / B-tree 對 JSON 無效 / BRIN 對非 correlated 資料無效 / multi-column 順序錯)、跟 query-optimization 的 EXPLAIN 互補
- SQL.15 字串比較與 collation:相等、排序、LIKE 與索引可用性
同一段等值條件在各家回不同的列的原因、LIKE 與等號何時分岔、索引與條件的比較規則怎麼對上,以及規則該寫在哪一層
- SQL.17 查詢的代價:資料分布、索引與寫法各自的影響
找重複值的分組、自連接與 EXISTS 在有無索引與不同重複次數下的實測時間與計畫,以及比較查詢快慢時要補上的資料量、分布、索引與統計資訊
- 1.19 資料表長期成長的成本:查詢讀的量、列表的部分索引、查詢以外的成本、分割與唯一約束、批次資料的共用欄位
哪些表會隨營運年數一直變大、怎麼判斷一條查詢讀的量跟著回傳筆數還是跟著表的大小、列表排除大宗資料時排除條件與索引的位置、表變大之後在查詢以外增加的成本與該量的指標、依時間分割與唯一約束的衝突,以及同一批建立的資料共用欄位的存放位置;附 PostgreSQL 17 的實測
- Cardinality 與 Selectivity(基數與選擇率)
看到「這一欄基數太低、索引沒用」,或想知道最佳化器憑什麼決定要不要走索引時,查這兩個數各自量什麼
- SQL.21 可讀性與執行代價:兩者一致與分岔的情形
寫法差異在什麼情形下免費、什麼情形下分岔,以及分岔時該動查詢還是動 schema
- Partial Index(部分索引)
列表或查詢只看表裡的一小類列、而其餘大宗資料讓索引又大又讀得慢時,查部分索引的寫法、查詢要帶什麼條件規劃器才會用它,以及排除條件要放在哪張表
- SQLite SQL Dialect and Index Limits
SQLite type affinity、NULL / date handling、constraint、index、query planner 與 PostgreSQL / MySQL 差異