0

我正在使用 innodb mysql 表来存储数据。在我的项目中,我必须将 maxmind geoip 数据库存储在 mysql 中(以具有不同实体的本地外键)。

大多数教程如何在 mysql 中导入 maxmind geoip 数据库,建议遵循具有 ip 范围的表的表定义:

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,它需要一个主键(它自动为 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 使用聚集索引,所以它基本上需要做 2 次索引查找而不是 1 次,但花费的时间并不明显。

于 2013-02-04T17:32:21.070 回答