1. 选择合适的索引类型
PostgreSQL 提供多种索引类型,需根据查询场景选择:
CREATE INDEX idx_users_name ON users (last_name);。CREATE INDEX idx_orders_order_no_hash ON orders USING hash (order_no);。CREATE INDEX idx_gin ON articles USING GIN (tags);。CREATE INDEX idx_brin ON logs USING BRIN (timestamp_column);。2. 优化多列索引设计
status = 'completed' 的区分度高于 create_time),能显著提高索引利用率。(user_id, order_date)),避免单独为每个列建索引(减少索引维护开销)。3. 利用高级索引特性减少冗余
WHERE status = 'completed'),减少索引大小,提高查询性能。示例:CREATE INDEX idx_completed_orders ON orders (order_date) WHERE status = 'completed';。INCLUDE 子句将查询所需的其他列包含在索引中,实现“仅索引扫描”(无需回表访问表数据)。示例:CREATE INDEX idx_covering ON users (username) INCLUDE (email, phone);。LOWER(name)),支持基于表达式的查询优化。示例:CREATE INDEX idx_expr ON users ((LOWER(name)));。4. 定期维护索引以保持性能
CONCURRENTLY 选项建索引,避免锁表影响业务(如 CREATE INDEX CONCURRENTLY idx_users_email ON users (email);)。REINDEX 命令重建索引(如 REINDEX INDEX idx_users_name;),或在 VACUUM 阶段自动维护。pg_stat_user_indexes 视图监控索引使用情况(如 idx_scan 列表示索引扫描次数),识别未被使用的索引(idx_scan = 0)并删除,减少维护开销。5. 避免索引滥用以平衡性能