主キーと対応する詳細の両方の IP アドレス範囲 (開始と終了) を含むテーブルに 170 万件を超えるレコードがあります。
テーブル構造は
mysql> desc csv;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| begin | bigint(20) | NO | PRI | 0 | |
| end | bigint(20) | NO | PRI | 0 | |
| code | char(2) | YES | | NULL | |
| country | varchar(50) | YES | | NULL | |
| city | varchar(50) | YES | | NULL | |
| area | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
主キーにインデックスを付けているため、このように完全に一致する場合は検索が高速です
mysql> SELECT * FROM csv WHERE begin=3338456576;
+------------+------------+------+---------------+----------+---------------+
| begin | end | code | country | city | area |
+------------+------------+------+---------------+----------+---------------+
| 3338456576 | 3338456831 | US | UNITED STATES | NEW YORK | NEW YORK CITY |
+------------+------------+------+---------------+----------+---------------+
1 row in set (0.03 sec)
しかし、範囲内で検索しようとすると、時間がかかります。
mysql> SELECT * FROM csv WHERE begin<3338456592 AND end>3338456592;
+------------+------------+------+---------------+----------+---------------+
| begin | end | code | country | city | area |
+------------+------------+------+---------------+----------+---------------+
| 3338456576 | 3338456831 | US | UNITED STATES | NEW YORK | NEW YORK CITY |
+------------+------------+------+---------------+----------+---------------+
1 row in set (1.59 sec)
クエリを最適化して範囲内の IP アドレスを検索する方法はありますか?
編集
テーブル作成ステートメント
CREATE TABLE `csv` (
`begin` bigint(20) NOT NULL DEFAULT '0',
`end` bigint(20) NOT NULL DEFAULT '0',
`code` char(2) DEFAULT NULL,
`country` varchar(50) DEFAULT NULL,
`city` varchar(50) DEFAULT NULL,
`area` varchar(50) DEFAULT NULL,
PRIMARY KEY (`begin`,`end`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;