Wie verwenden Sie Fremdschlüssel und einen räumlichen Index in einer MySQL-Tabelle?

Unser Projekt hält die Weltdatenbank in einer treestruktur innerhalb der INNODB-Tabelle von MySQL db. Die Erde ist die Wurzel, dann Länder, dann Landregionen und die Standorte sind die Blätter.

Ein Fremdschlüssel wird verwendet, um Kindern einen schnellen Zugang zu ermöglichen (zum Beispiel Städte in einer Region).

Jetzt wollen wir eine schnelle Geosuche in der database für gegebene Koordinaten implementieren. Eine naheliegende Lösung ist die Verwendung von SPATIAL INDEX, einer function von MyISAM -Tabellen. MyISAM-Tabellen unterstützen jedoch keine Fremdschlüssel. Und INNODB-Tabellen unterstützen SPATIAL INDEX nicht.

Wenn wir also die MyISAM-Tabelle verwenden, müssen wir den Fremdschlüssel verlassen, und das würde Kinder viel zu lange suchen lassen.

Wie können wir schnelle Kindersuche in tree kombinieren und haben auch einen RAUM INDEX in einer Tabelle?

Solutions Collecting From Web of "Wie verwenden Sie Fremdschlüssel und einen räumlichen Index in einer MySQL-Tabelle?"

Wie können wir schnelle Kindersuche in tree kombinieren und haben auch einen RAUM INDEX in einer Tabelle?

Erstellen Sie die Indizes für id und parentId Ihrer Tabelle manuell:

 CREATE INDEX ix_mytable_parentid ON mytable (parentid) 

Beachten Sie, dass da id höchstwahrscheinlich ein PRIMARY KEY , kein expliziter Index dafür erforderlich it (einer wird implizit erstellt).

BTW , wenn Sie die natürliche Geo-basierte Hierarchie haben, was ist der Sinn der Eltern-Kind-Beziehungen für die search?

Sie können die Abfragen so SPATIAL , dass sie die SPATIAL Indizes verwenden:

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

Dies wird den räumlichen Index für die search und die Beziehung für die Feinfilterung verwenden.