2013-02-04 65 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次,但所花費的時間不會很明顯。

相關問題