no tengo MySQL para probar pero tengo curiosidad qué tan eficiente es su INTERSECT:
select points.*
from points
join
(
select id from points where x > 100 AND x < 200
intersect
select id from points where y > 100 AND y < 200
intersect
select id from points where z > 100 AND z < 200
) as keyset
on points.id = keyset.id
No necesariamente recomendar este - pero es algo para tratar, especialmente si tiene índices separados en x , y y z.
EDITAR: Dado que mySQl no es compatible con INTERSECT, la consulta anterior podría reescribirse utilizando UNIONES de vistas en línea. Cada vista contendría un conjunto de claves y cada vista tendría la ventaja de los índices separados que ha colocado en x, y y z. El rendimiento dependería del numnber de las claves devueltas y del algoritmo de intersección/unión.
Primero probé el enfoque de intersección (en SQLite) para ver si había formas de mejorar el rendimiento en consultas espaciales, salvo el uso de su módulo R-Tree. INTERSECT en realidad fue más lento que usar un único índice no compuesto en uno de los valores espaciales y luego escanear el subconjunto de la tabla base para obtener los otros valores espaciales. Pero los resultados pueden variar según el tamaño de la base de datos. Después de que la tabla ha alcanzado un tamaño gigantesco y el disco I/O se vuelve más importante como factor de rendimiento, puede ser más eficiente interceptar conjuntos de claves discretos, cada uno de los cuales ha sido instanciado a partir de un índice, que hacer una exploración de la tabla base subecuente a un fetch-from-index inicial.
Tus consultas de rango de uso. Los índices son inútiles. A veces puede hacer que funcione si puede discretizar los valores y usar el operador in. Me gusta: 'donde x en (100, 101, ... 200)' Este es un excelente artículo que explica la diferencia - http://explainextended.com/2009/10/07/in-list-vs-range-condition- mysql/ –
Mira el enlace de nate c, mi "solución" era incorrecta. –