Как оптимизировать этот IP-адрес для поиска местоположения? - PullRequest
1 голос
/ 26 сентября 2011
UPDATE tracker SET t_loc_id=(SELECT cb_loc_id FROM city_blocks WHERE INET_ATON(t_ip) BETWEEN cb_start_ip_num AND cb_end_ip_num LIMIT 1);

В tracker имеется около 300К записей и в city_blocks около 3,6М записей.Он работает уже более 30 минут.

У меня уже есть уникальные индексы на cb_start_ip_num и cb_end_ip_num.

В любом случае я могу ускорить его?


Хорошо, я позволил ему работать около 2 часов, и он сделал только около 9K записей.

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

Создайте индекс в столбце с верхней границей (cb_end_ip_num) и найдите первую строку, для которой это значение больше или равно заданному значению.

SELECT * FROM city_blocks WHERE cb_end_ip_num >= 123456789 LIMIT 1

Я использовал это для maxmind, и оно работает очень хорошо.

1 голос
/ 27 сентября 2011

http://jcole.us/blog/archives/2007/11/24/on-efficiently-geo-referencing-ips-with-maxmind-geoip-and-mysql-gis/

Я преобразовал свои диапазоны IP-адресов в полигоны и добавил пространственный индекс, как указано в статье выше, а затем запустил мой запрос на обновление:

UPDATE tracker JOIN city_blocks ON mbrcontains(cb_ip_poly, pointfromwkb(point(inet_aton(track_ip),0))) SET t_loc_id=cb_loc_id

, который выполнялся в 45секунд в первый раз, 8 секунд - против предполагаемых 10–4 дней, которые потребовались бы для другого запроса.

В статье также упоминается решение болванки, но оно все еще работает ужасно медленно.Не могу понять, почему ... Я не знаю, были ли сломаны мои индексы (я пытался их перестроить), или ему не нравилось находиться в подзапросе или что-то в этом роде?

Говоря о подзапросах ...Это решение не работает вообще с подзапросом.Я полагал, что подзапрос был бы быстрее, потому что я мог бы добавить предел 1, и он не должен был бы объединять все со всем, но это не так.Технически, без ограничения, он должен был бы продолжить поиск, чтобы увидеть, есть ли другие потенциальные совпадения / диапазоны, в которые попадает IP, но я думаю, что это не имеет значения в этом сценарии, потому что все правильно проиндексировано и есть только 1 сегмент, в который он может попастьк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...