データの保存にinnodbmysqlテーブルを使用しています。私のプロジェクトでは、maxmind geoipデータベースをmysqlに保存する必要があります(異なるエンティティを持つネイティブ外部キーを持つため)。
ほとんどのチュートリアルでは、IP範囲を持つテーブルのテーブル定義に従ってmysqlアドバイスにmaxmindgeoipデータベースをインポートする方法を説明します。
CREATE TABLE IF NOT EXISTS `GeoLiteCity_Blocks` (
`startIpNum` int(10) unsigned NOT NULL,
`endIpNum` int(10) unsigned NOT NULL,
`locId` int(10) unsigned NOT NULL,
PRIMARY KEY (`startIpNum`,`endIpNum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
しかし、私はORMを使用しています。これには1つの主キーが必要です(CRUDエンティティの多くのメソッドを自動的に実装します)。そのため、別のテーブル構造を使用することを考えました。
CREATE TABLE `ipblocks` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`startIpNum` int(10) unsigned NOT NULL,
`endIpNum` int(10) unsigned NOT NULL,
`locId` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `IP_RANGE` (`startIpNum`,`endIpNum`),
KEY (`locId`) // FOREIGN KEY
) ENGINE=InnoDB;
このテーブルへの最も一般的なクエリは次のとおりです。
SELECT locId FROM ipblocks
WHERE %IP_ADDRESS% BETWEEN startIpNum AND endIpNum
LIMIT 1
理論的には、これにより、テーブルデータを使用する場合と同様に、ORMとしてネイティブに使用できます。質問したかったのですが、これによりパフォーマンスが大幅に低下しますか(ハードディスクのスペースは気にしないので、パフォーマンスの方がはるかに重要です)。
ipブロックを含むテーブルには、約200万行があります。