?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
索引并非一定要是一個(gè)底層表的字段, 還可以是一個(gè)函數(shù)或者從一個(gè)或多個(gè)字段計(jì)算出來的標(biāo)量表達(dá)式。 這個(gè)特性對(duì)于快速訪問那些基于計(jì)算結(jié)果的表非常有用。
比如,做大小寫無關(guān)比較的常用方法是使用lower
函數(shù):
SELECT * FROM test1 WHERE lower(col1) = 'value';
如果已經(jīng)在lower(col1)函數(shù)的結(jié)果上定義了索引,那么這個(gè)查詢可以使用索引:
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
如果我們把這個(gè)索引聲明為UNIQUE, 那么它會(huì)禁止創(chuàng)建那種col1數(shù)值只是大小寫有別或完全相同的數(shù)據(jù)行。 因此,在表達(dá)式上的索引可以用于強(qiáng)制那些無法定義為簡(jiǎn)單唯一約束的約束。
另外一個(gè)例子是,如果我們經(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á)式周圍書寫圓括弧, 就像我們?cè)诘诙€(gè)例子里顯示的那樣。如果表達(dá)式只是一個(gè)函數(shù)調(diào)用, 那么可以省略,就像我們?cè)诘谝粋€(gè)例子里顯示的那樣。
從維護(hù)角度來看,索引表達(dá)式相對(duì)費(fèi)勁一些,因?yàn)樵诓迦霐?shù)據(jù)行或者更新數(shù)據(jù)行的時(shí)候,都必須為每一行計(jì)算生成的表達(dá)式。 不過,索引表達(dá)式不是在索引查找的時(shí)候進(jìn)行計(jì)算的,因?yàn)樗鼈円呀?jīng)存儲(chǔ)在索引里了。 在上面的兩個(gè)例子里,系統(tǒng)都把查詢看做只是WHERE indexedcolumn = 'constant',所以搜索的速度等效于任何其它簡(jiǎn)單的索引查詢。 因此,表達(dá)式上的索引在檢索速度比插入和更新速度更重要的場(chǎng)合下是有用的。