Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Tiempos en consulta de Geolocalizacion exagerado

Estas en el tema de Tiempos en consulta de Geolocalizacion exagerado en el foro de Mysql en Foros del Web. BUENAS amigos.... Me consegui unas tablas con info de geolocalizacion , todo perfecto salvo que al consultar la mas grande, de unos 3 millones de ...
  #1 (permalink)  
Antiguo 11/02/2011, 23:06
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Pregunta Tiempos en consulta de Geolocalizacion exagerado

BUENAS amigos....

Me consegui unas tablas con info de geolocalizacion, todo perfecto salvo que al consultar la mas grande, de unos 3 millones de registros, el tiempo a veces llega casi a los 15 segundos en un AMD X4 con 3Gb de RAM!

En promedio, no baja de 1.5 segundos.......que creo que para una consulta es MUCHISIMO!

Para determinar el pais debo obtener la IP, pasarla a formato IPv4 buscarla entre columnas que definen rangos en la tabla CityBlocks y luego con el locId buscar en la tabla CityLocation:

Cita:
SELECT locId FROM CityBlocks WHERE $ip BETWEEN startIpNum AND endIpNum LIMIT 1
SELECT * FROM CityLocation WHERE locId = $locId LIMIT 1
Aca las tablas

Cita:
CREATE TABLE IF NOT EXISTS `cityblocks` (
`startIpNum` bigint(20) NOT NULL,
`endIpNum` bigint(20) NOT NULL,
`locId` bigint(20) NOT NULL,
PRIMARY KEY (`startIpNum`),
UNIQUE KEY `locId` (`startIpNum`,`endIpNum`,`locId`),
KEY `endIpNum` (`endIpNum`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


CREATE TABLE IF NOT EXISTS `citylocation` (
`locId` bigint(20) NOT NULL,
`country` varchar(2) NOT NULL,
`region` varchar(2) NOT NULL,
`city` varchar(50) NOT NULL,
`postalCode` varchar(10) NOT NULL,
`latitude` int(11) NOT NULL,
`longitude` int(11) NOT NULL,
`metroCode` int(11) NOT NULL,
`areaCode` int(11) NOT NULL,
PRIMARY KEY (`locId`),
UNIQUE KEY `locId` (`locId`,`country`,`region`,`city`,`postalCode`,`l atitude`,`longitude`,`metroCode`,`areaCode`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
__________________
Salu2!

Última edición por Italico76; 11/02/2011 a las 23:26
  #2 (permalink)  
Antiguo 12/02/2011, 05:05
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Tiempos en consulta de Geolocalizacion exagerado

CREO que el problema es el BETWEEN porque no me sirven los indices cuando busco ENTRE

http://forums.mysql.com/read.php?22,178071
http://www.dbforums.com/mysql/121655...ater-than.html
__________________
Salu2!
  #3 (permalink)  
Antiguo 12/02/2011, 06:51
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Tiempos en consulta de Geolocalizacion exagerado

y la SOLUCION que he pensado........ PROBLEMA RESUELTO

SELECT locId FROM CityBlocks WHERE 3193711229 BETWEEN startIpNum AND endIpNum LIMIT 1 lento
SELECT locId FROM CityBlocks WHERE 3193711229 > startIpNum AND 3193711229 < endIpNum LIMIT 1 lento

SELECT locId FROM CityBlocks WHERE 3193711229 > startIpNum ORDER BY startIpNum DESC LIMIT 1 rapidisimo!
y luego verifico que en ese registro 3193711229 < endIpNum (desde PHP)

o...

SELECT locId FROM CityBlocks WHERE (3193711229 > startIpNum AND 3193711229 < endIpNum) ORDER BY startIpNum DESC LIMIT 1

La UNICA DUDA es como uno esta consulta con esta otra: SELECT * FROM CityLocation WHERE locId = $locId LIMIT 1
__________________
Salu2!
  #4 (permalink)  
Antiguo 12/02/2011, 07:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Tiempos en consulta de Geolocalizacion exagerado

SELECT cl.country, cl.region, cl.city, cl.postalCode, cl.latitude, cl.longitude, cl.metroCode, cl.areaCode FROM CityLocation cl INNER JOIN (SELECT locId FROM CityBlocks WHERE (3193711229 >= startIpNum AND 3193711229 <= endIpNum) ORDER BY startIpNum DESC) t1 ON cl.locid = t1.locId
  #5 (permalink)  
Antiguo 12/02/2011, 07:28
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
De acuerdo Respuesta: Tiempos en consulta de Geolocalizacion exagerado

QUE GRANDE JURENA!

Quedo asi:

Código PHP:
SELECT cl.countrycl.regioncl.citycl.postalCodecl.latitudecl.longitudecl.metroCodecl.areaCode FROM CityLocation cl
 INNER JOIN 
(SELECT locId FROM CityBlocks WHERE  ($ip startIpNum AND $ip endIpNumORDER BY startIpNum DESC LIMIT 1t1 ON cl.locid t1.locId 
__________________
Salu2!
  #6 (permalink)  
Antiguo 12/02/2011, 08:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Tiempos en consulta de Geolocalizacion exagerado

me alegro, Italico76,
pero no sé por qué usas > en lugar de > =, y < en lugar de <=; creo que si lo dejas como lo tienes, podrías no encontrar algunas referencias.
  #7 (permalink)  
Antiguo 12/02/2011, 08:13
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Tiempos en consulta de Geolocalizacion exagerado

JURENA! hola de nuevo!

EDIT: el tema es que por igual no sirve porque estoy en un rango, en todo caso podria sumar +/-1 a los extremos
__________________
Salu2!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:54.