Autor Zpráva
H13
Profil
Ahoj,

mohl by mi dát někdo tip, jak ukládat IP adresy do databáze tak, aby bylo možné ukládat jak kompletní IP tak i jejich rozsah a poté jej (samozřejmě) co nejrychlej prohledávat a porovnávat (pořád na úrovni sql dotazu)

Příklad:

hledaná ip: 100.100.100.100
uložený rozsah v databázi: 100.100.100 ... vrátí true


V opačném případě, kdy by se hledal rozsah a v databázi by byla uložená celá IP, by mě napadlo něco jako:

Select ip from tabulka where ip like '100.100.100.%' 

Samozřejmě roszah může být různý 100.100 nebo 100.100.100 atd.

Možná by bylo i lepší řešení vyhnout se řetezci (varchar) s "like" a nahradit ho číslem(int) (tedy po nějakém převedení IP na číslo)???


Každopádně díky všem za rady a tipy.
pcmanik
Profil
H13:
Na otázku ti neodpoviem, ale rád by som zdôraznil, že nám pomali prichádza ipv6 a tam potom nebudeš mať ako porovnávať rozsahy adries. Je na to lepšie myslieť už teraz pri návrhu DB, ako o pár rokov s tým mať kopu problémov.
H13
Profil
pcmanik:
Rozumím, ale zatím bych to prostě potřeboval jen pro IPv4
michalc
Profil
Ukládej to jako číslo a rozsah definuj maskou. Pak stačí využít převodní vzorec v dotazu.
Kajman
Profil
michalc:
Ukládej to jako číslo a rozsah definuj maskou

Ukládání ip4 do čísel určitě, ale rozsah bych definoval hraničními hodnotami.

H13:
MySql má přo převody přímo funkce INET_ATON a INET_NTOA.
H13
Profil
Děkuji moc, jestli to dobře chápu (hraniční hodnoty), pak by rozsah u:

10.0.5

byl mezi:
10x256^3 + 0x256^2 + 5×256 + 0
a
10x256^3 + 0x256^2 + 5×256 + 255

a např.:

10.3
10x256^3 + 3x256^2 + 0×256 + 0
a
10x256^3 + 0x256^2 + 255×256 + 255

a znamená to, že by místo jednoho sloupce v databázi byly dva: začátek rozsahu a konec rozsahu s tím, že SQL by bylo:

WHERE ip >= zacatek_rozsah AND ip <= konec_rozsah

Pokud by byla uvedena kompletní IP, pak by se ukládala jak do zacatek_rozsah tak i do konec_rozsah, aby splnila podmínku
?
Kajman
Profil
Může to tak být.
ninja
Profil
H13: Zvažte možnost hledání na základě rozsahů a funkce MBRCONTAINS(), viz článek http://blog.jcole.us/2007/11/24/on-efficiently-geo-referencing-ips-with-maxmind-geoip-and-mysql-gis/. Mohu potvrdit, že je to opravdu velmi rychlé a dle mých testů rychlejí než ostatní různé metody.
H13
Profil
Kajman:
Děkuji

ninja:
Díky za odkaz ... no nevím, jestli jsem ten článek pochopil dobře, ale připadlo mi to jako doporučení, že použití komplikované metody (implementace, přehlednost) spojené s MBRCONTAINS ušetří sice výkon počítače oproti velmi jednoduché metodě, ale jen do doby, než se někdo ozve a v komentáři sdělí, že hlavní problém výkonosti u jednoduché metody byl BETWEEN a že statndardní >= s LIMITem zase na tom není tak špatně ... každopádně ještě jednou díky za ten odkaz, hodně věcí mi objasnil ... teď ještě zjistit jestli přidání:

ip_from <= your IP

k

WHERE ip_to >= INET_ATON('%s')

opravdu bude tak hodně náročný na výkon jak píše autor :-(
Kajman
Profil
Pokud se rozsahy navzájem nekryjí, tak by to tím limitem šlo stroji zjednodušit. Kolik řádků tam v budoucnu očekáváte?
H13
Profil
Kajman:
Právě že jde v podstatě o málo řádků, tipuji kolem tisícovky ... rozsahy se asi krýt budou - jde o to zjistit, jestli je prostě IP adreasa v databázi (a je jedno, jestli se jako první najde celá IP, nebo nějaký rozsah, co je první na řadě) ... LIMIT určitě použiju ... je nějaký problém (např. výkonostní), pokud bude používán LIMIT 1 a adresy se budou krýt?
Kajman
Profil
Pokud se intervaly kryjí a nejsou v nich všechna ip, tak to s tím order by a limitem fungovat nebude. Takže buď klasické between s tím, že na 1000 záznamů to nebude tak hrozné, nebo použít tu metodu s geo funkcemi z článku.
H13
Profil
Ok, děkuji moc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0