База данных ip подсетей с привязкой к странам и городам

671 views
Skip to first unread message

Alexander Panko

unread,
Nov 16, 2008, 6:43:17 AM11/16/08
to RubyOnRails to russian
Доброго времени суток,
подскажите где на данный момент желательно в одном месте купить/
скачать сабж?

Собирать руками с разных источников совсем не хочется, идеальный
вариант - подписка на такую базу + обновления к ней.

Nikolay Grebnev

unread,
Nov 16, 2008, 7:42:27 AM11/16/08
to ror...@googlegroups.com
maxmind.com - но может кто-то еще есть
+ мы еще пользуемся несколькими чисто русскими базами...

Николай
Партнерская программа http://www.owndating.ru

Iscander

unread,
Nov 17, 2008, 3:59:56 AM11/17/08
to RubyOnRails to russian

Maxim Bondaruk

unread,
Nov 17, 2008, 5:22:44 AM11/17/08
to ror...@googlegroups.com
Не поделитесь секретом что за чисто русские базы у вас есть?

16 ноября 2008 г. 15:42 пользователь Nikolay Grebnev
<nikolay...@gmail.com> написал:

Maxim Bondaruk

unread,
Nov 17, 2008, 5:24:08 AM11/17/08
to ror...@googlegroups.com
17 ноября 2008 г. 11:59 пользователь Iscander <isca...@gmail.com> написал:
> http://www.wipmania.com/ru/base/
>

Жаль что у них информация только по странам... без регионов как на MaxMind...

Nikolay Grebnev

unread,
Nov 17, 2008, 5:50:43 AM11/17/08
to ror...@googlegroups.com
Уже приеденная тут Випмания и http://ipgeobase.ru/ - нам она в автоматическом режиме не требуется....


Николай
Партнерская программа http://www.owndating.ru

2008/11/17 Maxim Bondaruk <maxim.b...@gmail.com>

Ilyas Iskakov

unread,
Nov 18, 2008, 4:03:27 AM11/18/08
to RubyOnRails to russian
Есть полная база данных www.ip2location.com. (Страны, регионы, города
и провайдер). Английская версия.

> подписка на такую базу + обновления к ней.
Подписка и обновление к ней присутвуют.

Max Lapshin

unread,
Nov 25, 2008, 7:00:18 AM11/25/08
to ror...@googlegroups.com
Слушайте, я посмотрел на ipgeobase.ru. Вроде база то нормальная, но делали её прямо таки Бородатые Физтеховцы.
Кто-нибудь уже писал код для парсинга их баз?

Max Lapshin

unread,
Nov 26, 2008, 5:34:53 AM11/26/08
to ror...@googlegroups.com
Продолжу вопрос, может у кого-нибудь возникнут идеи.

Итак, база IP адресов хранится в виде IP-start, IP-end, city
Надо для нашего ip найти ту запись, в которой IP-start <= ip && ip <= IP-end && IP-end - IP-start = min

Попытка залить эту базу в Mysql приводит к тому, то он фактически не пользуется индексами. Перебор
50 тыс записей из общего количества в 100 тыс — это никакое не ускорение.

Я хочу убрать это всё в двоичное дерево, которое будет работать по принципу nested-sets.
Вопрос: есть какая-то подходящая библиотека для этого? Мне нужен специфичный алгоритм поиска,
но не писать же на C этот код =(

Oleg Shaldybin

unread,
Nov 26, 2008, 5:42:04 AM11/26/08
to ror...@googlegroups.com
Это в числовом представлении адресов не пользуется индексами?

2008/11/26 Max Lapshin <max.l...@gmail.com>:
--
Oleg Shaldybin
http://shaldybin.com

Max Lapshin

unread,
Nov 26, 2008, 5:46:25 AM11/26/08
to ror...@googlegroups.com


2008/11/26 Oleg Shaldybin <oleg.sh...@gmail.com>

Это в числовом представлении адресов не пользуется индексами?

Угу. Строю индекс по start, индекс по end, индекс по size = end - start.
Использует только либо start, либо end.

Stanislav Yadykin

unread,
Nov 26, 2008, 6:12:28 AM11/26/08
to ror...@googlegroups.com
> Угу. Строю индекс по start, индекс по end, индекс по size = end - start.
> Использует только либо start, либо end.

mysql> alter table `tablename` add index `range` (`start`, `end`);
mysql> explain select * from `tablename` force index (`range`) where
127000012001 between `start` and `end`;
+----+-------------+-----------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key |
key_len | ref | rows | Extra |
+----+-------------+-----------+--------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | tablename | system | range | NULL | NULL
| NULL | 1 | |
+----+-------------+-----------+--------+---------------+------+---------+------+------+-------+

Так не поможет? Дерево индекса уже будет построено по обоим полям.

--
WBR,
Stanislav Yadykin

Max Lapshin

unread,
Nov 26, 2008, 6:38:18 AM11/26/08
to ror...@googlegroups.com
Пробовал. Только вот:

mysql> explain select * from ipgeobases force index (index_ipgeobases_range) where 1401544691 between start and stop\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: ipgeobases
         type: range
possible_keys: index_ipgeobases_range
          key: index_ipgeobases_range
      key_len: 4
          ref: NULL
         rows: 57083
        Extra: Using where
1 row in set (0.00 sec)


И 57083 строчки всё равно что full table scan.

Dmytro Shteflyuk

unread,
Nov 26, 2008, 7:50:55 AM11/26/08
to ror...@googlegroups.com
2008/11/26 Max Lapshin <max.l...@gmail.com>:

> Угу. Строю индекс по start, индекс по end, индекс по size = end - start.
> Использует только либо start, либо end.

А что, мускул научился юзать несколько индексов в одном запросе? О_о

--
Best regards, Dmytro Shteflyuk
http://kpumuk.info/

Max Lapshin

unread,
Nov 26, 2008, 10:14:27 AM11/26/08
to ror...@googlegroups.com
Забил болт на ipgeobase.ru, взял либу от maxmind, допилил ей бандл.
Прирост скорости в 100 тыс раз. Мускль делает один поиск за 0,2 секунды, а GeoIP за это же время делает 100 000 поисков.

Maxim Bondaruk

unread,
Nov 26, 2008, 12:43:29 PM11/26/08
to ror...@googlegroups.com
поделись, пожалуйста, тем что допилил...

26 ноября 2008 г. 18:14 пользователь Max Lapshin
<max.l...@gmail.com> написал:

Max Lapshin

unread,
Nov 26, 2008, 6:09:21 PM11/26/08
to ror...@googlegroups.com
Ага, оформлю только.

Резюме по Maxmind такое: база — дрянь. Там 8 разных способов написания Москвы, ни в какие ворота не лезет.
Сделал хранилище в памяти для базы Ipgeodata, получилось вместо 0,2 секунд мускля на один запрос,
0,3 секунды на 1 млн запросов. Оформлю получше и выложу.

Anton Ageev

unread,
Nov 27, 2008, 5:09:18 AM11/27/08
to ror...@googlegroups.com
2008/11/27 Max Lapshin <max.l...@gmail.com>:

А разве nginx-у подсунуть её нельзя? Формат сильно смахивает на maxmind-ский.


--
WBR, Anton

Artiom Diomin

unread,
Nov 27, 2008, 5:14:50 AM11/27/08
to ror...@googlegroups.com

http://www.wipmania.com/ru/base/

тут база и в SQL формате и для nginx-а
--
Artiom Diomin <kro...@gmail.com>

Max Lapshin

unread,
Nov 27, 2008, 6:05:42 AM11/27/08
to ror...@googlegroups.com
MySQL то не канает: я написал на два экрана поисковик по базе Ipgeobase, он делает 1 млн поисков за 4 секунды
Мускль делает за это время только 20 поисков.

На самом деле у maxmind просто омерзительная база. Очень грязная, Москва в 8 разных формах написания и встречается
даже Тёплый Стан. Не знаю, какие индусы её заполняли.

Короче, сегодня положу свой ruby-inline поисковик по ipgeobase

Alexander Panko

unread,
Nov 27, 2008, 6:28:58 AM11/27/08
to RubyOnRails to russian
Вот таким запросом вытянется из базы за рекордно короткое время:

SELECT * FROM ipgeobases WHERE start <= ? ORDER BY start DESC LIMIT 1

По поводу maxmind, я выбрал всетаки ее, бесплатную версию, но не смог
побороть глюки их либы, которая ругалась на версию базы. В итоге залил
все в postgres.

Alexander Panko

unread,
Nov 27, 2008, 6:29:08 AM11/27/08
to RubyOnRails to russian
Вот таким запросом вытянется из базы за рекордно короткое время:

SELECT * FROM ipgeobases WHERE start <= ? ORDER BY start DESC LIMIT 1

По поводу maxmind, я выбрал всетаки ее, бесплатную версию, но не смог
побороть глюки их либы, которая ругалась на версию базы. В итоге залил
все в postgres.


On 27 нояб, 14:05, "Max Lapshin" <max.laps...@gmail.com> wrote:

Alexander Panko

unread,
Nov 27, 2008, 6:32:15 AM11/27/08
to RubyOnRails to russian
Забыл добавить что индекс уникальный по start нужен. Все это работает
так как подсеть всегда имеет start и stop адреса и подсети не
пересекаются, а только могут быть вложены друг в друга.

Max Lapshin

unread,
Nov 27, 2008, 6:49:40 AM11/27/08
to ror...@googlegroups.com


Только в базе ipgeobase практически каждый start будет иметь несколько повторений.

Max Lapshin

unread,
Nov 27, 2008, 6:56:23 AM11/27/08
to ror...@googlegroups.com
http://github.com/maxlapshin/ipgeobase

Делаем require 'ipgeobase_ext' в config/environment.rb, после чего в нужном классе делаем
class Ipgeobase
  extend IpgeobaseExt
  def self.lookup(ip)
     City.find_by_name(intern_lookup(ip))
  end
end


edbond

unread,
Nov 28, 2008, 4:01:16 AM11/28/08
to RubyOnRails to russian
В постгресе все решается с помощью ip4r http://ip4r.projects.postgresql.org/

Max Lapshin

unread,
Nov 28, 2008, 4:08:06 AM11/28/08
to ror...@googlegroups.com
Насколько быстро оно работает?
Reply all
Reply to author
Forward
0 new messages