Autor | Zpráva | ||
---|---|---|---|
H13 Profil |
#1 · Zasláno: 29. 8. 2012, 19:17:00
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 |
#3 · Zasláno: 29. 8. 2012, 19:33:01
pcmanik:
Rozumím, ale zatím bych to prostě potřeboval jen pro IPv4 |
||
michalc Profil |
#4 · Zasláno: 29. 8. 2012, 19:57:39
Ukládej to jako číslo a rozsah definuj maskou. Pak stačí využít převodní vzorec v dotazu.
|
||
Kajman Profil |
#5 · Zasláno: 29. 8. 2012, 21:45:17
|
||
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 10x256^3 + 0x256^2 + 5×256 + 255 a např.: 10.3 10x256^3 + 3x256^2 + 0×256 + 0 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 |
#7 · Zasláno: 31. 8. 2012, 01:09:10
Může to tak být.
|
||
ninja Profil |
#8 · Zasláno: 31. 8. 2012, 13:04:09
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 |
#10 · Zasláno: 31. 8. 2012, 16:11:45
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 |
#11 · Zasláno: 1. 9. 2012, 22:14:38
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 |
#12 · Zasláno: 3. 9. 2012, 09:16:39
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 |
#13 · Zasláno: 3. 9. 2012, 14:17:25
Ok, děkuji moc.
|
||
Časová prodleva: 12 let
|
0