# 11.7.表达式上的索引
索引列不必只是基础表的一列,还可以是从表的一列或多列计算出来的函数或标量表达式。此功能有助于根据计算结果快速访问表。
例如,进行不区分大小写比较的一种常见方法是使用降低
功能:
SELECT * FROM test1 WHERE lower(col1) = 'value';
如果已在查询结果上定义了索引,则此查询可以使用索引下(col1)
功能:
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
如果我们宣布这个指数唯一的
,它将阻止创建可乐1
值仅在大小写上有所不同,行的大小写也不同可乐1
值实际上是相同的。因此,表达式上的索引可用于强制执行不能定义为简单唯一约束的约束。
另一个例子是,如果一个人经常进行如下查询:
SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';
那么,创建这样一个索引可能是值得的:
CREATE INDEX people_names ON people ((first_name || ' ' || last_name));
的语法创建索引
命令通常需要在索引表达式周围写括号,如第二个示例所示。当表达式只是一个函数调用时,可以省略括号,如第一个示例所示。
索引表达式的维护成本相对较高,因为必须为每一行插入和非热更新计算派生表达式。然而,索引表达式是不在索引搜索期间重新计算,因为它们已存储在索引中。在上面的两个例子中,系统将查询视为其中indexedcolumn='constant'
因此,搜索的速度相当于任何其他简单的索引查询。因此,当检索速度比插入和更新速度更重要时,表达式索引非常有用。