1

位置データにマッピングされた IP アドレス範囲のテーブルの形式で、ジオロケーション サービス用に提供された生データがあります。

アドレスはバイトパックされた整数 (バイトごとに 1 つのドット付きクワッド) として提供されるため、格納と比較が容易になるため、このテーブルの各行は、範囲の下位アドレス、範囲の上位アドレス、およびいくつかのテキスト位置フィールドを提供します。CIDR を使用する必要はありません/使用できません。

テーブルは数百万レコードです。

私は強力な SQL チョップを持っていません。私が継承したコードは、単純に次のような sql 呼び出しを行います。

SELECT location FROM geodata WHERE lookup_address >= range_low AND lookup_address =< range_high

パフォーマンスはひどいです。私の理解では、これは一致するレコードの線形検索を行うだけです。これを一時的に回避するために、クライアント キャッシュをツリー マップにまとめて、これをログ パフォーマンスに落とし込みました。今まさに取り組みたい。

この問題は、アドレス、電話番号などの SQL の世界で時々発生するようです。少なくともログ パフォーマンスを取得できるように、SQL テーブル内の範囲を整理してインデックスを付ける「標準的な」方法はありますか。直接SQLクエリの?

4

1 に答える 1

0

range_lowフィルタ フィールドにインデックスがあることを確認します。この場合はrange_high.

CREATE INDEX IX_geodata_range_fields ON geodata (range_low, range_high)
于 2013-09-10T18:22:22.247 に答える