私はこのクエリを持っています:
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 はキーを使用せず、すべての行を取得します。