2013-02-04 99 views
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百万行。

+1

最常用查询的最佳索引是空间索引(http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html) – newtover

+0

空间索引不能用于上面提到的查询。 'IP_RANGE'索引可以工作。 –

+0

@ G-Nugget,你说的对,它会非常性能地降低,或者它会好吗? – avasin

回答

1

性能不会有明显下降。唯一真正有所作为的是如果表中的数据会发生变化,但看起来数据基本上是静态的。将使用的索引基本相同,但InnoDB使用聚簇索引,因此它基本上需要执行2次索引查找而不是1次,但所花费的时间不会很明显。

相关问题