首页/数据/SQL 速查/PostgreSQL 表达式索引
性能与执行计划72 条

PostgreSQL 表达式索引

把表达式结果建进索引:lower(email)、(timestamp_col::date) 等查询条件可直接命中,前提是表达式完全一致。

SQL 速查数据更新于 2026-10-12

示例

示例
CREATE INDEX idx_users_lower_email ON users (lower(email));

-- 命中:表达式与索引一致
SELECT * FROM users WHERE lower(email) = 'a@x.com';

-- 不命中:查询端表达式不一致
SELECT * FROM users WHERE trim(lower(email)) = 'a@x.com';
要求索引表达式必须是 IMMUTABLE;now()、random() 这类稳定或不稳定函数不能用于索引
命中条件查询里的表达式要与索引表达式一致(函数、顺序、大小写都算)
对比 MySQLMySQL 8.0.13+ 的功能索引思路相同,表达式需括号包裹

易错点

  • 用不满足 IMMUTABLE 的函数建索引:会被直接拒绝;建索引前先确认函数的 volatility 属性
  • 查询端换了等价但不同的写法:lower(email) 索引不会被 trim(lower(email)) 命中

数据来源与参考

  • PostgreSQL Documentation · Indexes on Expressions
  • PostgreSQL Documentation · Function Volatility Categories
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌