PHP: Forma correcta de almacenar IP en MySQL y rápida de búsqueda de IP a través de millones de filas

StackOverflow https://stackoverflow.com/questions/3980489

Pregunta

Estoy almacenando las direcciones IPv4 en una columna de tipo "unsigned int" con inet_aton. [¿Lo estoy haciendo bien? Y está utilizando "sin firmar" necesario?] Esta columna en particular está indexado también. Debido a que habrá millones de filas y múltiples filas que contienen la misma IP a través de toda la mesa lo que será la forma más rápida de buscar estas filas?

.. o voy de este por el camino equivocado?

¿Fue útil?

Solución

¿Lo estoy haciendo bien? Y está utilizando "Sin firmar" necesario?

Sí. Sin unsigned direcciones IP más altas no serán almacenados correctamente y usando int (en lugar de varchar) almacena de manera más eficiente.

¿cuál será la forma más rápida de buscar para estas filas?

En cuanto a la optimización de búsqueda, que depende de lo que todo lo que está buscando (tablas adicionales, etc ...). En general, la indexación de una columna int sin signo le da un rendimiento rápido.

Otros consejos

Uso de la inet_aton es la forma correcta de hacerlo, por lo que no está almacenando información adicional sin sentido (sin punto de ser capaz de almacenar un valor mayor que 256 para cualquiera de los 3 números dados). Es el resultado de un número de 32 bits, que se ajusta a la unsigned int.

Index Server en la columna de la int hará que las búsquedas por dirección IP rápida. Si su base de datos se hace muy grande, empezará a correr en la ampliación problemas para almacenar este tipo de cosas en MySQL.

Vamos a suponer que no vamos a hacer eso, pero a señalar que el almacenamiento de información de registro completo para un gran sitio ocupado en un RDBMS es generalmente aceptado ser algo malo (tm). No es necesario las propiedades de integridad relacional las garantías de bases de datos, y se escribe muchas más entradas de lo que lee. Considere nosql, o de agregar a los archivos planos en su lugar, y analizar sus registros cuando sea necesario el uso de un programa específico.

Sí, esta es la mejor manera de almacenar direcciones IP en MySQL.

Si nos fijamos en la documentación de INET_ATON se puede ver que se recomienda utilizar una columna UNSIGNED INT o cualquier dirección IP con el primer octed más de 127 no se almacenará correctamente.

Esta es también una manera muy rápida de realizar búsquedas. manijas de MySQL enteros columnas muy bien, y mediante la indexación de esta columna y utilizando INET_ATON en su búsqueda, se puede lograr consultas muy rápidas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top