次に、バックエンドで、「指定されたズーム レベルのビューポート」を指す文字列を作成する予定です。 .
通常のインデックスは、インデックス付きの列の文字列の左端の 5 (または 6 または 7) 文字を見ている限り、最新の dbms で適切に機能するはずです。
SELECT ...
...
WHERE column_name LIKE '02113%';
PostgreSQL では、式でインデックスを作成することもできます。したがって、最初の 5 文字でインデックスを作成できます。
CREATE INDEX your_index_name ON your_table (left(column_name, 5));
そのようなインデックスが 3 つまたは 4 つある場合、PostgreSQL のクエリ オプティマイザーが適切なインデックスを選択することを期待しています。(5キャラ分、6キャラ分など)
テーブルを作成し、100 万行のランダム データを入力しました。
次のクエリでは、PostgreSQL のクエリ オプティマイザーが正しいインデックスを選択しました。
explain analyze
select s
from coords
where left(s, 5) ='12345';
0.1ミリ秒で戻ってきました。
また、GROUP BY を使用してテストしました。繰り返しになりますが、PostgreSQL のクエリ オプティマイザは正しいインデックスを選択しました。
"GroupAggregate (cost=0.00..62783.15 rows=899423 width=8) (actual time=91.300..3096.788 rows=90 loops=1)"
" -> Index Scan using coords_left_idx1 on coords (cost=0.00..46540.36 rows=1000000 width=8) (actual time=0.051..2915.265 rows=1000000 loops=1)"
"Total runtime: 3096.914 ms"
GROUP BY 句のような式left(name, 2)
では、テーブルのすべての行ではないにしても、PostgreSQL がインデックスのすべての行にアクセスする必要があります。そのため、クエリに 3096 ミリ秒かかりました。インデックス内の 100 万行にアクセスする必要がありました。しかし、EXPLAIN プランから、インデックスを使用したことがわかります。
通常、地理アプリケーションでは PostGIS テーブルに対してバウンディング ボックスを使用して、アクセスする行数を減らすことを期待しています。クアッド ツリーの実装でそれ以上のことができない場合、私は PostGIS を使い続けて、その専門家になることができます。(ある程度の時間を費やすまで、その仕事ができないことは確かではありません。)