2010-10-24 22 views
5

Tengo dos tablas: una es ip_group_city de ipinfodb.com que contiene números de ip_start para determinar la ubicación de IP, y otra es "visitas" con información sobre el visitante del sitio web que contiene la columna 'ip'.Efectivo ip-> consulta de ubicación

Necesito seleccionar top 10 region_code (de ip_group_city) marcando region_code para cada IP de la tabla de "visitas".

En este momento estoy cargando todas las IPs de "visitas" en una matriz y utilizar esa información IP para consultar el ip_group_city por:

SELECT region_code 
FROM ip_group_city 
WHERE ip_start <= INET_ATON(IP_FROM_ARR) 
ORDER BY ip_start DESC LIMIT 1 

Soy incapaz de crear algún tipo de consulta anidada que hacer el trabajo para mí, porque ahora mismo las cosas son un poco lentas :) - toma hasta 30s en mi laptop xampp (AMD Turion x2 2GHz, ejecutando Windows 7 última versión de 64 bits)

Aquí está la tabla con direcciones IP (visitas)

CREATE TABLE IF NOT EXISTS `visits` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`clientid` mediumint(8) unsigned NOT NULL, 
`ip` varchar(15) NOT NULL, 
`url` varchar(512) NOT NULL, 
`client_version` varchar(64) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=49272 ; 

Gracias

+0

También, consejos sobre otras maneras alrededor son aceptados. Tal vez haya algún otro DB que sea más efectivo para este rey de trabajo. Tengo más de 10.000 IPs en el db que necesito resolver para la geolocalización. – hummingBird

+0

No puedo reproducir el problema. Usando 'ipinfodb_one_table_small' con MySQL 5.1, tu consulta se completa en menos de 10ms para mí (en Linux). Supongo que los 30 son para realizar varias consultas, p. para todas las visitas. Si es así, muestre también la tabla de visitas y cómo la recorre. –

+0

ok, estoy agregando la estructura de la tabla a la pregunta :) – hummingBird

Respuesta

2

Dado que usted ha dicho otras soluciones son bienvenidos ...

Es posible que desee echa un vistazo a MaxMind. Tienen buenas búsquedas de país y ciudad por IP. Puede instalar un complemento de Apache o PHP para hacerlo rápido, ni siquiera tiene que manejar la base de datos usted mismo.

+0

gracias, iré con esto. – hummingBird

2

Para indexar su mesa:

ALTER TABLE `ip_group_city` ADD INDEX (`ip_start`) 

para obtener los mejores 10 region_codes:

SELECT igc.region_code 
FROM ip_group_city igc 
JOIN visits v ON igc.ip_start = v.ip 
GROUP BY igc.region_code 
ORDER BY COUNT(*) DESC 
LIMIT 10 
+0

desafortunadamente, v.ip es una cadena que representa la dirección IP, mientras que ip_start es una calculadora numérica por la función inet_aton de la dirección IP. , en el DB hay 'solo' direcciones de 1.5Mil, y esas direcciones cubren básicamente todos los ips posibles. Tu unión no funcionaría. – hummingBird

0
ALTER TABLE `ip_group_city` ADD INDEX (`ip_start`) 

eso es todo lo que estoy diciendo. asegúrese de usar árbolB y no de hash: D

Cuestiones relacionadas