0

データの保存に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万行があります。

4

1 に答える 1

1

パフォーマンスが大幅に低下することはありません。それが実際に違いを生むのは、テーブル内のデータが変更される場合だけですが、データは基本的に静的であるように見えます。使用されるインデックスは基本的に同じですが、InnoDBはクラスター化インデックスを使用するため、基本的に1つではなく2つのインデックスルックアップを実行する必要がありますが、かかる時間は目立ちません。

于 2013-02-04T17:32:21.070 に答える