2017-05-15 2 views
1

Ich habe einfache SQL-Abfrage mit JOIN, die, wenn der Punkt in Multipolygon verbunden:Geringe Leistung mit ST_Contains

SELECT `oktmo_geometry`.`oktmo` FROM `place` 
INNER JOIN `oktmo_geometry` ON ST_CONTAINS(`oktmo_geometry`.`geometry`, Point(`place`.lng, `place`.lat)) 

Aber diese Abfrage sehr langsam. Ich habe 12k Plätze und 300 Geometrie. Für nur 50 Orte dauert es 3-5 Sekunden (abhängig von der Version MySQL). Ich hatte versucht, MariaDB zu benutzen, und das war ~ 50 mal schneller als MySQL, aber immer noch langsam, denke ich.

Vielleicht stimmt etwas mit meiner Abfrage oder irgendetwas anderem nicht?

oktmo_geometry. geometry ist Multipolygon-Typ.

+0

Verwenden Sie den Index 'SPATIAL'? Mit welchem ​​'MOTOR', MyISAM? oder InnoDB? –

Antwort

0

ist ein guter Teil Ihrer Geschwindigkeit hier verloren: Point (place .lng, place .lat)

Diese nicht indiziert werden kann, so im Prinzip durch jede place Reihe zu gehen, hat die abzuschließen Suche.

Eine bessere Lösung wäre, eine neue Spalte wie place .pointvalue zu schaffen, die ein Punkt-Datentyp von Punkt (place .lng, place .lat) abgeleitet wird, und dann place Index .pointvalue.

dann Ihre Abfrage würde so aussehen

mo_geometry . oktmo FROM Ort INNER JOIN oktmo_geometry ON ST_CONTAINS( oktmo_geometry . Geometrie , place`.pointvalue)

Ich vermute, dass viel schneller gehen.

Verwandte Themen