Ricordate che l'IPS non sono un indirizzo testuale, ma un ID numerico. Ho una situazione simile (stiamo facendo ricerche geo-ip) e se memorizzi tutti i tuoi indirizzi IP come numeri interi (ad esempio, il mio indirizzo IP è 192.115.22.33 quindi è archiviato come 3228767777), allora puoi cercare gli IP facilmente utilizzando gli operatori di spostamento a destra.
Lo svantaggio di tutti questi tipi di ricerche è che non è possibile trarre vantaggio dagli indici e si deve eseguire una scansione completa della tabella ogni volta che si effettua una ricerca. Lo schema sopra può essere migliorato memorizzando sia l'indirizzo IP di rete della rete CIDR (l'inizio dell'intervallo) sia l'indirizzo di trasmissione (la fine dell'intervallo), quindi per esempio per memorizzare 192.168.1.0/24 è possibile memorizzare due colonne:
network broadcast
3232235776, 3232236031
e quindi si può a partita che è sufficiente fare
SELECT count(*) FROM bans WHERE 3232235876 >= network AND 3232235876 <= broadcast
Ciò permetterà di memorizzare reti CIDR nel database e abbinarli contro gli indirizzi IP in modo rapido ed efficiente sfruttando rapido indici numerici.
Nota della discussione sotto:
MySQL 5.0 include un'ottimizzazione delle query a distanza denominata "index merge intersect", che permette di velocizzare tali query (ed evitare di scansione completa della tabella), a condizione che:
- C'è un indice a più colonne che corrisponde esattamente alle colonne nella query, in ordine. Quindi, per l'esempio di query sopra riportato, l'indice dovrebbe essere
(network, broadcast)
.
- Tutti i dati possono essere recuperati dall'indice. Questo è vero per
COUNT(*)
, ma non è vero per SELECT * ... LIMIT 1
.
MySQL 5.6 include un'ottimizzazione denominata MRR che velocizza anche il recupero completo delle righe, ma non rientra nell'ambito di questa risposta.
Raspi, So che questa domanda è vecchio, ma ... è la vostra colonna cidr il numero di one-bit nella maschera di rete, quindi per IPv6 è sempre 64 e per IPv4 è un numero compreso tra 0 e 32? Anche se suppongo che 0 vieterebbe tutti gli indirizzi ... :) – ErikE