Эффективный запрос местоположения ip->

У меня две таблицы: один из ip_group_city из ipinfodb.com, содержащий номера ip_start для определения местоположения IP-адресов, а другой – «посещения» с информацией о посетителе веб-сайта, содержащей столбец «ip».

Мне нужно выбрать top 10 region_code (из ip_group_city), проверив region_code для каждого IP из таблицы «посещений».

Сейчас я загружаю все IP-адреса из «посещений» в массив и используя эту информацию IP для запроса ip_group_city:

SELECT region_code FROM ip_group_city WHERE ip_start <= INET_ATON(IP_FROM_ARR) ORDER BY ip_start DESC LIMIT 1 

Я не могу создать какой-то вложенный запрос, чтобы выполнить эту работу для меня, потому что сейчас все немного медленнее 🙂 – на моем ноутбуке xampp занимает до 30 секунд (AMD Turion x2 2 ГГц, работает с Windows 7 с 64-битной версией )

Вот таблица с IP-адресами (посещениями)

 CREATE TABLE IF NOT EXISTS `visits` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `clientid` mediumint(8) unsigned NOT NULL, `ip` varchar(15) NOT NULL, `url` varchar(512) NOT NULL, `client_version` varchar(64) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=49272 ; 

благодаря

Поскольку вы сказали, что другие решения приветствуются …

Возможно, вы захотите проверить MaxMind . У них хороший поиск по стране и городу по IP. Вы можете установить плагин Apache или PHP, чтобы сделать его быстрым – даже не нужно обрабатывать базу данных самостоятельно.

Чтобы индексировать таблицу:

 ALTER TABLE `ip_group_city` ADD INDEX ( `ip_start` ) 

Чтобы получить 10 лучших регистров региона:

 SELECT igc.region_code FROM ip_group_city igc JOIN visits v ON igc.ip_start = v.ip GROUP BY igc.region_code ORDER BY COUNT(*) DESC LIMIT 10 
 ALTER TABLE `ip_group_city` ADD INDEX ( `ip_start` ) 

вот и все, что я говорю. обязательно используйте btree, а не hash: D

Вы можете проверить этот пост:

Местоположение от ip-адреса