使用复合主键与简单索引的性能有何不同?

时间:2013-02-04 12:36:57

标签: mysql indexing innodb composite-primary-key

我正在使用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 个答案:

答案 0 :(得分:1)

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