Форум: "Потрепаться";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
ВнизSQL + IP диапазон Найти похожие ветки
← →
Undert © (2004-07-16 21:12) [0]Как оптимальнее хранить в БД MySQL диапазон IP адресов так, что бы потом можно было бы выяснить является ли данный IP членом данного диапазона.
Таблица ID, ipa1, ipa2, ipa3, ipa4, ipb1, ipb2, ipb3, ipb4 уж очень хороша, но при запросе
$a[0] = "xxx";
$a[1] = "xxx";
$a[2] = "xxx";
$a[3] = "xxx";$result = mysql_query("select * from ripe where (ipa1<=$a[0]<=ipb1) and (ipa2<=$a[1]<=ipb2) and (ipa3<=$a[2]<=ipb3) and (ipa4<=$a[3]<=ipb4)") or die("!");
SQL умирает :(( БД = 400Mb
← →
SergP © (2004-07-16 21:39) [1]Имхо лучше хранить Ip адрес целиком в одном поле, а не по октетам в четырех полях. Запрос будет попроще и выполняться должен тогда побыстрее.
Да и кстати этот твой запрос какой-то не совсем правильный....
Например по нему получается что Ip адрес 20.20.20.20 не принадлежит диапазону 20.20.19.50 - 20.20.20.250
Сделай для каждого IP одно поле куда бы вместилось четырехбайтное целое число:
И будет запрос типа:
select * from ripe where ($a between ipa and ipb)
← →
Undert © (2004-07-16 22:43) [2]Хммм... одной чиселкой ?
Спасибо, попробую ...
← →
SergP © (2004-07-17 07:15) [3]А что за данные у тебя в таблице хранятся? и может ли быть в таблице несколько записей удовлетворяющих проверяемому ip? или только не более одной?
← →
Esu © (2004-07-17 08:06) [4]Запрос совсем неправильный.
Вообщем "одной чиселкой" рулит :)
← →
Undert © (2004-07-17 15:50) [5]SergP ©
Ну... как тебе сказать ... распределение зон по материкам/странам/городам/адресам (если таковы имеются) :))) Естественно результат только один, т.е. не более одного.
Esu ©
Пробую чиселкой - крута, выполняется запрос моментально, но результат возвращает пустым при любом заданном IP :(( глюк ...
← →
Undert © (2004-07-17 16:10) [6]XFWD - 195.131.84.203
select * from ripe where (19513184203 between ipa and ipb)
Результат - 0
Хотя такой диапазон существует записанный как
ipa = 195131840
ipb = 19513184255:
inetnum: 195.131.84.0 - 195.131.84.255
netname: WEBPLUS6
descr: WEBPlus Ltd.,
descr: St.Petersburg
country: RU
admin-c: VEF2-RIPE
tech-c: MICK-RIPE
tech-c: AIP1-RIPE
tech-c: AVU4-RIPE
rev-srv: ns.wplus.net
rev-srv: ns1.wplus.net
status: ASSIGNED PA
notify: postmaster@wplus.net
mnt-by: AS6690-MNT
changed: alexey@wplus.net 20001020
source: RIPE
← →
Undert © (2004-07-17 16:14) [7]Кстати, тут появляется проблема - результатов получается более чем 1, например
IP = 19513184203
D1 = 195131840 2147483647 195.131.84.0 195.131.84.255
D2= 195131840 1951318415 195.13.184.0 195.13.184.15
← →
Undert © (2004-07-17 16:15) [8]Т.е. не заметил что второй только до 15, но все равно встретятся же такие которые так же до 255 в 4м октете
← →
SergP © (2004-07-19 05:47) [9]Я имел ввиду то что нужно хранить IP в виде 4-х байтного целого числа:
Например 195.13.184.15 должно представляться как 3272456207
т.е. (195*256^3+13*256^2+184*256+15)
ну и проверяемый ip сначала нужно перевести в такой же вид, а потом подсовывать в запрос...
← →
Undert © (2004-07-19 10:25) [10]Ok, огромное спасибо!!!!
← →
Judith © (2004-07-19 12:45) [11]В MySQL есть ф-ция INET_ATON
http://dev.mysql.com/doc/mysql/ru/Miscellaneous_functions.html#IDX1331
← →
Undert © (2004-07-19 12:47) [12]Judith ©
Она оч медленно это делает с 4мя миллионами записями =))))
← →
ИдиотЪ (2004-07-19 13:11) [13]так их всего 4 с чем-то миллиона, нафига тогда запрос писать, если они все у тебя
← →
Anatoly Podgoretsky © (2004-07-19 13:17) [14]Так нафига тянуть 4 миллиона записей, не будет это быстро ни в одной базе
← →
ИдиотЪ (2004-07-19 13:18) [15]если он главным провайдером, понятно, почему инет тормозит ...
← →
Vitaly © (2004-07-19 13:26) [16]Дааааааааааааааааааааааа...уж (с Киса Воробьянинов)
Офигеть!
← →
Undert © (2004-07-19 14:42) [17]А если серъезно,
к примеруexplain select * from ripe where (137757706 between ipa and ipb)
выдает
1 SIMPLE ripe ALL 2211382 Using where
Ясен пень почему, и вот только что бы получить ID нужного IP диапазона БД должна перебрать 2 211 382 записей - долговато выходит ...:((
А потом, к примеру из таблицы ripe_data по полученному ID еще получать данные для данного диапазона - это 25 миллионов записиейexplain select * from ripe_data where ip="100098"
1 SIMPLE ripe_data ALL 25416938 Using where
Как это можно оптимизировать нормально ?
← →
Undert © (2004-07-19 14:44) [18]Anatoly Podgoretsky ©
А как ж и где тогда хранить данные распределения диапазонов IP адресов ? :)))
← →
ИдиотЪ (2004-07-19 14:59) [19]ту Undert © [17]
а что в твоем понятии долго ?
а индексы вообще есть или так заводишь ?
← →
Anatoly Podgoretsky © (2004-07-19 15:01) [20]При чем тут хранение, я про выборку.
Для большинства баз хранение нескольких миллионов записей
то ничто, выборка тоже, но не миллионы же, передача такого количества займет время и что делать с таким количеством?
← →
Undert © (2004-07-19 15:20) [21]ИдиотЪ
Индексы! а что индексы? :)
Сделал по полям диапазонов - много не помогло... :((
Anatoly Podgoretsky ©
Дык хмм... а передача куда ? Я делаю выборку, в которой ко мне возвращается максимум 8 строк...
← →
Undert © (2004-07-19 15:35) [22]ИдиотЪ
Ааааа....
сасибо!!! проиндексировал еще один столбец и скорость теперь менее 1 секунды !!!аааа.... спасибо !!!
← →
Anatoly Podgoretsky © (2004-07-19 15:38) [23]Undert © (19.07.04 15:20) [21]
8 строк это мгновенно при нормально настроеной и нормальной базе
← →
ИдиотЪ (2004-07-19 15:48) [24]Undert ©
в принципе и первое представление данных должно так же быстро работать, если конечно педальку жать (не тормоза)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.035 c