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 сегмент, в который он может попастьк.