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