索引類型 | 適用場景 | 特點 |
---|---|---|
B-Tree | 等值查詢、范圍查詢、排序(默認類型) | 平衡樹結構,支持多列索引,可定義唯一約束 |
Hash | 精確等值查詢(如長字符串ID) | 查詢速度快,但不支持范圍查詢和排序 |
GiST | 空間數據、全文搜索、范圍類型 | 支持自定義操作符類,需配合PostGIS等擴展 |
GIN | 多值類型(數組、JSONB)、全文搜索 | 倒排索引,適合包含查詢,寫入性能較低 |
BRIN | 大表范圍查詢(如時間序列數據) | 空間占用小,依賴數據物理順序,需定期VACUUM |
-- 普通索引
CREATE INDEX index_name ON table_name [USING method] (column_name [ASC|DESC] [NULLS FIRST|NULLS LAST]);
-- 復合索引(多列)
CREATE INDEX index_name ON table_name [USING method] (column1, column2, ...);
-- 唯一索引
CREATE UNIQUE INDEX index_name ON table_name (column_name);
-- 部分索引(僅對滿足條件的行建索引)
CREATE INDEX index_name ON table_name [USING method] (column_name) WHERE condition;
-- 包含索引(避免回表查詢)
CREATE INDEX index_name ON table_name [USING method] (column1) INCLUDE (column2);
-- 為用戶表的email字段創建普通索引
CREATE INDEX idx_users_email ON users(email);
-- 為訂單表創建復合索引(按用戶ID和訂單時間查詢)
CREATE INDEX idx_orders_user_time ON orders(user_id, order_time DESC);
-- 為JSONB字段創建GIN索引(全文搜索)
CREATE INDEX idx_products_json ON products USING GIN(to_tsvector('english', description));
-- 查看表的索引信息
SELECT * FROM pg_indexes WHERE tablename = 'table_name';
-- 使用psql命令行工具查看
\di+ table_name
DROP INDEX [IF EXISTS] index_name;
-- 重建索引(解決碎片問題)
REINDEX INDEX index_name;
-- 分析表(更新統計信息,幫助優化器選擇索引)
ANALYZE table_name;
EXPLAIN ANALYZE
分析查詢計劃,確認是否使用索引