Estoy tratando de migrar una base de datos PostGIS a MySQL 8 y estoy teniendo un gran golpe de rendimiento cuando se trata de MBRIntersects.
Utilizando Mapbox para renderizar mosaicos vectoriales, necesito extraer la geometría que interseca algún cuadro delimitador específico de un total de 80k características.
En PostGIS, utilizando la siguiente consulta obtengo un tiempo de ejecución total de ~230ms ( ~30ms para consultas posteriores, ya que es probable que los resultados se almacenen en caché)
SELECT gid, ST_AsGeoJson(geom)
FROM table
WHERE geom && ST_MakeBox2D(ST_MakePoint(), ST_MakePoint())::geometry;
Sin embargo, en MySQL 8, utilizando la siguiente consulta obtengo un tiempo de ejecución total de ~620ms y no parece que se esté produciendo ningún almacenamiento en caché, ya que las consultas posteriores tardan lo mismo.
SELECT gid, ST_AsGeoJson(geom)
FROM table
WHERE MBRIntersects(ST_PolygonFromText(), ST_SRID(geom, 0));
En EXPLAIN
de la consulta anterior no muestra ningún índice utilizado. La tabla se creó como se describe a continuación:
CREATE TABLE IF NOT EXISTS table (
gid INT PRIMARY KEY AUTO_INCREMENT
);
ALTER TABLE table
ADD COLUMN geom MultiPolygon NOT NULL SRID 4326,
ADD SPATIAL INDEX(geom);
Como ventaja, la consulta PostGIS devuelve 3 filas, a diferencia de MySQL que sólo devuelve 2.
¿Hay algo que esté haciendo mal? ¿Existe una forma mejor de consultar los mosaicos del mapa?