3

電話フィールドが として保存されているPostgresテーブルがありますがvarchar(10)、市外局番を頻繁に検索します。

select * from bus_t where bus_phone like '555%'

これらの検索を容易にするためにインデックスを作成したかったのですが、試行中にエラーが発生しました:

CREATE INDEX bus_ph_3 ON bus_t USING btree (bus_phone::varchar(3));

ERROR: 42601: syntax error at or near "::"

私の最初の質問は、これをどのように達成するかということですが、フィールドの最初の X 文字にインデックスを付けることが理にかなっているのか、それともフィールド全体にインデックスを付けることが同じように効果的であるのかについても疑問に思っています。

4

2 に答える 2

4

like '555%'完全な列でインデックスを使用すると、同様に使用されます。最初の 3 文字だけを索引付けする必要はありません。

最初の 3 文字だけにインデックスを付けたい場合 (スペースを節約するためなど)、次の関数を使用できますleft()

CREATE INDEX bus_ph_3 ON bus_t USING btree (left(bus_phone,3));

whereただし、そのインデックスを使用するには、句でその式を使用する必要があります。

where left(bus_phone,3) = '555';

しかし、繰り返しになりますが、これはおそらくやり過ぎであり、完全な列のインデックスで十分であり、他のクエリにも使用できます。たとえばbus_phone = '555-1234'、最初の 3 文字だけのインデックスでは使用できません。

于 2013-10-08T19:07:08.637 に答える