我正在使用 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 万行。