我有这个查询:
SELECT `country`
FROM `geoip_base`
WHERE 1840344811 BETWEEN `start` AND `stop`
它严重使用索引(使用,但解析表的大部分)并且工作太慢。我尝试使用 ORDER BY 和 LIMIT,但没有帮助。
“开始 <= 1840344811 AND 1840344811 <= 停止” 工作类似。
CREATE TABLE IF NOT EXISTS `geoip_base` (
`start` decimal(10,0) NOT NULL,
`stop` decimal(10,0) NOT NULL,
`inetnum` char(33) collate utf8_bin NOT NULL,
`country` char(2) collate utf8_bin NOT NULL,
`city_id` int(11) NOT NULL,
PRIMARY KEY (`start`,`stop`),
UNIQUE KEY `start` (`start`),
UNIQUE KEY `stop` (`stop`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
表有 57,424 行。
解释查询“... BETWEEN START AND STOP ORDER BY START LIMIT 1”:使用键stop
并获得 24099 行。没有顺序和限制,mysql 不使用键并获取所有行。