2010-02-02 10 views
7

Nuestro proyecto mantiene la base de datos mundial en estructura de árbol dentro de la tabla INNODB de MySQL db. La tierra es la raíz, luego los países, luego las regiones de los países y las ubicaciones son las hojas.¿Cómo usar claves externas y un índice espacial dentro de una tabla MySQL?

Una clave externa se utiliza para proporcionar un acceso rápido a los niños (por ejemplo, ciudades de una región).

Ahora queremos implementar una búsqueda geográfica rápida en la base de datos para las coordenadas dadas. Una solución obvia es utilizar SPATIAL INDEX, que es una característica de las tablas MyISAM. Pero las tablas MyISAM no son compatibles con claves externas. Y las tablas INNODB no admiten ÍNDICE ESPACIAL.

Entonces, si usamos la tabla MyISAM, tenemos que abandonar la clave externa y eso haría que los niños busquen demasiado tiempo.

¿Cómo podemos combinar la búsqueda rápida de niños en árbol y también tenemos un ÍNDICE ESPACIAL en una tabla?

+0

Tenga en cuenta que la finalidad de la clave externa no es acelerar la consulta, sino reforzar la relación entre las tablas. Lo que acelerará la búsqueda es el índice que creará junto con la clave externa. – Benjamin

Respuesta

4

¿Cómo podemos combinar la búsqueda rápida de niños en árbol y también tenemos un ÍNDICE ESPACIAL en una tabla?

crear los índices de id y parentId de la tabla manualmente:

CREATE INDEX ix_mytable_parentid ON mytable (parentid) 

Nota que desde id es más probablemente un PRIMARY KEY, no se requiere un índice explícito sobre it (uno se creará implícitamente).

BTW, si tiene la jerarquía basada en geo natural, ¿de qué sirve usar las relaciones padre-hijo para buscar?

Usted puede hacer las consultas a utilizar los índices SPATIAL:

SELECT * 
FROM mytable m1 
JOIN mytable m2 
ON  MBRContains (m2.area, m1.area) 
     AND m2.parentId = m1.id 
WHERE m1.name = 'London' 

que utilizará el índice espacial para la búsqueda y la relación de filtrado fino.

Cuestiones relacionadas