典型電商商品篩選場景:用戶任意組合品類、品牌、價格、促銷等條件,且單字段選擇性極低(如「狀態=上架」佔 90%)。傳統 B-Tree 索引面臨三大困境:
| 方案 | 原理 | 優勢 | 劣勢 |
|---|---|---|---|
| Bitmap 索引 | 存儲 Key→行集 Bitmap,多條件做位運算 | 極適合低基數組合查詢,存儲小、運算快 | 寫入鎖表,僅 Oracle 支持,開源數據庫缺失 |
| 倒排索引 | 存儲 Key→行 ID 集合(List/Tree),多條件做集合運算 | 全文檢索成熟技術,ES/Solr 核心,支援精確/模糊匹配 | 引入搜索引擎增加架構複雜度、數據同步成本、運維負擔 |
(column_number, key_datum) 區分字段,值為壓縮的 CTID B-Tree 集合SELECT CASE ... END AS flag, gpppur.*
FROM T_MPS_INFO gpppur
WHERE gpppur.ATTRACT_TP = 0
AND gpppur.COLUMN_ID = 1
AND gpppur.FIELD2 = 1
AND gpppur.STATUS = 1
ORDER BY flag, PC_SORT_NUM, GB_BEGINDATE DESC
LIMIT 45
數據量 60 萬,MySQL 僅建 (FIELD2, STATUS) 組合索引。
ATTRACT_TP: 0→6458, 5→194333, 9→326485 (11 個值)
COLUMN_ID: 1→6479, 344→199271, 361→331979 (80 個值)
FIELD2: 1→11452, 5→200497, 9→331979 (11 個值)
STATUS: 1→531829 (佔 88%) (6 個值)
| 環境 | QPS | 平均延遲 | 95% 延遲 | 備註 |
|---|---|---|---|---|
| MySQL (原有索引) | 64 | 484 ms | 223 ms | sysbench 32 併發 |
| PostgreSQL (無額外索引) | 335 | 88 ms | 80 ms | 遷移後直接測試,性能已 5.2 倍 |
| PostgreSQL + GIN 索引 | 5412 | 5.8 ms | 9.4 ms | CREATE INDEX idx3 ON t_mps_info USING GIN(attract_tp, column_id, field2, status); |
| MySQL + 四字段組合索引 | ~4000 | - | - | 仍遜於 PG GIN 方案 |
CREATE EXTENSION btree_gin; -- 支持 int/varchar 等標量類型
CREATE INDEX idx3 ON t_mps_info USING GIN(attract_tp, column_id, field2, status);