2010-02-02 14 views
7

Il nostro progetto mantiene la banca dati mondiale nella struttura ad albero all'interno della tabella INNODB di MySQL db. La terra è la radice, quindi i paesi, quindi le regioni dei paesi e le località sono le foglie.Come utilizzare le chiavi esterne e un indice spaziale all'interno di una tabella MySQL?

Una chiave esterna è utilizzata per fornire un accesso rapido ai bambini (ad esempio città in una regione).

Ora vogliamo implementare una ricerca veloce nel database per le coordinate date. Una soluzione ovvia è l'uso dell'indice spaziale, che è una caratteristica delle tabelle MyISAM. Ma le tabelle MyISAM non supportano chiavi esterne. E le tabelle INNODB non supportano l'indice spaziale.

Quindi, se utilizziamo la tabella MyISAM, dobbiamo abbandonare la chiave esterna e ciò renderebbe i bambini troppo lunghi per la ricerca.

Come possiamo combinare la ricerca rapida di bambini nell'albero e avere anche un INDICE SPAZIALE in una tabella?

+0

Si noti che lo scopo della chiave esterna non è di accelerare la query, ma di rafforzare la relazione tra le tabelle. Ciò che velocizzerà la ricerca è l'indice che creerai insieme alla chiave esterna. – Benjamin

risposta

4

Come possiamo combinare la ricerca rapida di bambini nell'albero e avere anche un INDICE SPAZIALE in una tabella?

Creare gli indici id e parentId della tabella manualmente:

CREATE INDEX ix_mytable_parentid ON mytable (parentid) 

Nota che, dal momento id è più probabilmente un PRIMARY KEY, nessun indice esplicito è richiesto it (uno verrà creato implicitamente).

BTW, se si dispone della gerarchia geologica naturale, che senso ha utilizzare le relazioni padre-figlio per la ricerca?

È possibile effettuare le query di utilizzare le SPATIAL indici:

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

che utilizzerà l'indice spaziale per la ricerca e il rapporto per il filtraggio fine.

Problemi correlati