我正在使用innodb mysql表来存储数据。 在我的项目中,我必须在mysql中存储maxmind geoip数据库(使用不同实体的本机外键)。
大多数教程如何在具有ip范围的表的表定义之后的mysql建议中导入maxmind geoip数据库:
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块的表有大约2百万行。
答案 0 :(得分:1)
表现不会有明显下降。唯一真正有所作为的是,如果表中的数据会发生变化,但看起来数据基本上是静态的。将使用的索引基本相同,但InnoDB使用聚簇索引,因此它基本上需要执行2次索引查找而不是一次,但所花费的时间不会引人注意。