I have 2 tables: an IP Address table, and an IP Ranges table. I want to retrieve a list of ranges in the ranges table for which one or more of the IP addresses in the IP address table fall within that range. The IP addresses are represented as integers, and the IP ranges are non-overlapping.
What I'm trying to use is this:
SELECT title FROM ranges JOIN ips ON ip BETWEEN start AND stop
but it takes too long. Is there a better way?
Here is the structure:
mysql> describe ranges;
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| range_id | int(20) unsigned | NO | PRI | NULL | auto_increment |
| start | int(10) unsigned | NO | UNI | NULL | |
| stop | int(10) unsigned | NO | UNI | NULL | |
| title | varchar(200) | NO | | NULL | |
+------------+------------------+------+-----+---------+----------------+
mysql> describe ips;
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| ip_id | int(20) unsigned | NO | PRI | NULL | auto_increment |
| ip | int(10) unsigned | NO | MUL | NULL | |
+------------+------------------+------+-----+---------+----------------+
This is similar but different from this: http://forums.mysql.com/read.php?115,106747,106747#msg-106747
I've tried several different combinations of indexes, but no success.
CREATE TABLE `ranges` (
`range_id` int(20) unsigned NOT NULL auto_increment,
`start` int(10) unsigned NOT NULL,
`stop` int(10) unsigned NOT NULL,
`title` varchar(200) NOT NULL,
PRIMARY KEY (`range_id`),
UNIQUE KEY (`start`),
UNIQUE KEY (`stop`),
KEY `title` (`title`)
) ENGINE=MyISAM;
CREATE TABLE `ips` (
`ip_id` int(20) unsigned NOT NULL auto_increment,
`ip` int(10) unsigned NOT NULL,
PRIMARY KEY (`ip_id`),
KEY `ip` (`ip`)
) ENGINE=MyISAM;