0
我使用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百万行。
最常用查询的最佳索引是空间索引(http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html) – newtover
空间索引不能用于上面提到的查询。 'IP_RANGE'索引可以工作。 –
@ G-Nugget,你说的对,它会非常性能地降低,或者它会好吗? – avasin