Ip 範囲を別のテーブルの場所 ID にリンクするデータベースがあります。非常に大きいため、エアロスパイクを使用して新しいソリューションを作成しようとしています。
私たちが思いついた解決策は、間隔を使用することです。このようなもの:
キー: 1000000 (IP アドレスの int64) Bin1: デフォルト:1 (特定のブロックの開始位置 ID)
Bin2: 1234567:2 (ロケーション ID が変更されるブロックの最初の IP):(locationID)
Bin3: 1345678:3 (ロケーション ID が変更されるブロック内の 2 番目の IP):(locationID)
等
この方法を使用すると、行の量とサーバーの処理時間を削減しながら、数学的に IP からロケーション ID を取得できます。
自分のアイデアをテストしたいのですが、現在のシステムの変換に問題があります。
ロケーション ID が関連付けられた範囲 (0 ~ 160000 など) を持つデータベースがあります。
範囲テーブルには 9,297,631 行あります。
私が作成した C# スクリプトは、次の SQL を実行します。
SELECT * FROM dbo.GeoIPRanges
where (startIpNum BETWEEN 300000000 AND 300000100)
OR (endIpNum BETWEEN 300000000 AND 300000100)
OR (startIpNum <= 300000000 AND endIpNum >= 300000100)
呼び出しごとに約 4 秒かかります。上記の数値は一例です。それらが 100 のブロックになっていることがわかります。最大 IP 量は 4,294,967,295 です。これを 100 個のブロックで実行すると、それぞれ約 4 秒の 42,949,672 回の呼び出しが発生します。これには非常に長い時間がかかります。情報をエアロスパイクに必要な形式にフォーマットするのにかかる処理時間はごくわずかです。
このすべての情報を知っているので、これをスピードアップする方法についてのアイデアはありますか?