Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
6-1086807870
SendeR
2004-06-09 23:04
2004.08.08
Основы программирования сети.....


1-1090918507
Knight
2004-07-27 12:55
2004.08.08
Какой тип лучше выбрать...


8-1084714750
killer
2004-05-16 17:39
2004.08.08
как mod перевести в mp3 ?


1-1089959211
lexus3d
2004-07-16 10:26
2004.08.08
Список вложеных дерикторий


3-1089810996
Valeri
2004-07-14 17:16
2004.08.08
BeforePost





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский