Tengo una tabla de Idno Geo de InnoDB MySQL que tiene ~ 1 millón de filas. La estructura de la tabla es la siguiente:Cómo optimizar aún más esta tabla de MySQL para una única consulta
CREATE TABLE `geoid` (
`start_ip` int(11) NOT NULL,
`end_ip` int(11) NOT NULL,
`city` varchar(64) NOT NULL,
`region` char(2) NOT NULL,
PRIMARY KEY (`start_ip`,`end_ip`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
sólo habrá una consulta de tipo iba en contra de esta tabla:
SELECT city, region FROM geoid WHERE 1259650516 BETWEEN start_ip AND end_ip
Esta consulta tarda aproximadamente 0,4228 ~ s, lo que no es super lento, pero no increíblemente rápido éter.
Mi pregunta es: ¿Cómo puedo optimizar aún más mi tabla para esta única consulta?
me han tratado las siguientes cosas:
- cambiar el motor de almacenamiento MyISAM a, esto hizo que la consulta a tardar alrededor de 1,9 seg.
- Utilice la instrucción WHERE 'WHERE geoid.start_ip < = 1259650516 Y 1259650516 < = geoid.end_ip'. Pero eso toma aproximadamente .5 segundos para ejecutar en lugar de .4 ish.
He eliminado todas las filas inútiles de la tabla para hacerla más pequeña. Necesito las 1 millón de filas.
actualizar/SOLUCIÓN
Gracias al artículo siguiente, esto es lo que hice para solucionar este problema. (Sólo para completar esta respuesta para cualquier otra persona interesada)
que añade una nueva columna a la tabla anterior:
ALTER TABLE `geoid` ADD `geoip` LINESTRING NOT NULL
luego llené la nueva columna con los datos geográficos de start_ip y end_ip
GeomFromText(CONCAT('LINESTRING(', start_ip, ' -1, ', end_ip, ' 1)'))
entonces creó el índice espacial en la nueva columna
CREATE SPATIAL INDEX geoip_index ON geoid(geoip);
a partir de ahí, todo lo que tiene que hacer es cambiar su consulta a:
SELECT city, region FROM geoid WHERE MBRContains(geoip, GeomFromText(CONCAT('POINT(', 1259650516, ' 0)')));
Y SU HECHO. ¡Esto redujo la consulta de .42 a .0003 segundos !!!!!!!
Me encanta este ÍNDICE. Gracias. Espero eso ayude.
¿Creó un índice 'SPATIAL' en una tabla' InnoDB'? – Quassnoi
Primero lo convertí en MyISAM. – RonSper