?
This document uses PHP Chinese website manual Release
索引并非一定要是一個底層表的字段, 還可以是一個函數(shù)或者從一個或多個字段計算出來的標(biāo)量表達(dá)式。 這個特性對于快速訪問那些基于計算結(jié)果的表非常有用。
比如,做大小寫無關(guān)比較的常用方法是使用lower
函數(shù):
SELECT * FROM test1 WHERE lower(col1) = 'value';
如果已經(jīng)在lower(col1)函數(shù)的結(jié)果上定義了索引,那么這個查詢可以使用索引:
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
如果我們把這個索引聲明為UNIQUE, 那么它會禁止創(chuàng)建那種col1數(shù)值只是大小寫有別或完全相同的數(shù)據(jù)行。 因此,在表達(dá)式上的索引可以用于強(qiáng)制那些無法定義為簡單唯一約束的約束。
另外一個例子是,如果我們經(jīng)常使用下面這樣的查詢:
SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';
那么我們就值得創(chuàng)建下面這樣的索引:
CREATE INDEX people_names ON people ((first_name || ' ' || last_name));
CREATE INDEX命令的語法通常要求在索引表達(dá)式周圍書寫圓括弧, 就像我們在第二個例子里顯示的那樣。如果表達(dá)式只是一個函數(shù)調(diào)用, 那么可以省略,就像我們在第一個例子里顯示的那樣。
從維護(hù)角度來看,索引表達(dá)式相對費勁一些,因為在插入數(shù)據(jù)行或者更新數(shù)據(jù)行的時候,都必須為每一行計算生成的表達(dá)式。 不過,索引表達(dá)式不是在索引查找的時候進(jìn)行計算的,因為它們已經(jīng)存儲在索引里了。 在上面的兩個例子里,系統(tǒng)都把查詢看做只是WHERE indexedcolumn = 'constant',所以搜索的速度等效于任何其它簡單的索引查詢。 因此,表達(dá)式上的索引在檢索速度比插入和更新速度更重要的場合下是有用的。