2016-04-25 6 views
-1

Bei einer Geospatial Suche mit einem Geospacial Index auf Geom Feld, meine Zeit Abfrage erhöhen anormaly wenn ich ORDER BY Abstand, gibt es eine alternative Syntax ou Tricks, um das zu vermeiden? Hinweis Ich bin mir bewusst diesen Beitrag: https://explainextended.com/2011/02/11/late-row-lookups-innodb/ aber dieser Trick kann nicht mit der Abfrage erreichen werden Gebrüll:LIMIT mit ORDER BY Verlangsamung Abfrage Lösung für Geospatial Mysql 5.7

diese Abfrage ohne Auftrag von 0,005 s nehmen

SELECT 
ST_Distance_Sphere(Point(2.34, 48.85), geom) as distance 
FROM testgeo1 
WHERE ST_Contains(ST_MakeEnvelope(
        Point((2.34+(500/111)), (48.85+(500/111))), 
        Point((2.34-(500/111)), (48.85-(500/111))) 
       ), geom) 
    LIMIT 500 

ERKLÄREN:

+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-------------+ 
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref | rows | filtered | Extra  | 
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-------------+ 
| 1 | SIMPLE  | testgeo1 | NULL  | range | sp_index  | sp_index | 34  | NULL | 2609 | 100.00 | Using where | 
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-------------+ 

dieser mit ORDER BY nimmt 0,16s

SELECT 
    ST_Distance_Sphere(Point(2.34, 48.85), geom) as distance 
    FROM testgeo1 
    WHERE ST_Contains(ST_MakeEnvelope(
         Point((2.34+(500/111)), (48.85+(500/111))), 
         Point((2.34-(500/111)), (48.85-(500/111))) 
        ), geom) 
ORDER BY distance 
     LIMIT 500 

Lösungen, Vorschlag, alternative Syntax oder Tricks sind willkommen ..

+0

@Rick ur Link .. localhost geht, kann man es beheben bitte – jess

+0

(Sorry ...) Das Design in http: // mysql. rjweb.org/doc.php/latlng kann schneller sein. –

+0

@Rick ur metheod scheint interessant, aber ich würde die neueste Mysql-Standard-Methode beibehalten, wie ich gepostet, dieser Weg ist sehr effizient ohne Reihenfolge, es zeigt nur auf eine gemeinsame mysql Bug, ich suche nach einer einfachen alternativen Syntax/Trick, Siehe diesen Hinweis: https://mariadb.com/kb/en/mariadb/improvements-to-order-by/ danke anyway – jess

Antwort

0

Wenn es viele Tausende von Punkten innerhalb dieses Umschlags sind, ...

  • Die erste Abfrage (keine ORDER BY) wird Wählen Sie die ersten 500, die es in diesem Umschlag findet.
  • Die zweite Abfrage (mit ORDER BY) müssen alle Punkte in den Umschlag finden, berechnen den Abstand für jeden einzelnen, um das Ergebnis sortieren, dann liefern 500.

Dies ist eine einfache Tatsache-of-life über LIMIT mit und ohne ORDER BY. Es hat nichts spezifisch mit SPATIAL oder 5.7 zu tun.

Bitte weisen für das, was ich tue, behauptet

SELECT COUNT(*) 
    FROM testgeo1 
    WHERE ST_Contains(ST_MakeEnvelope(
       Point((2.34+(500/111)), (48.85+(500/111))), 
       Point((2.34-(500/111)), (48.85-(500/111))) 
      ), geom) ; 
+0

der Ausgang ist 1277, ich habe 1 Million Zeilen in der Tabelle, nicht sicher zu sehen, was der Punkt ist .. – jess

+0

Es musste berechnen, ST_Distance_Sphere 1277 mal. Ach, das ist nicht genug, um meinen Standpunkt zu verdeutlichen. Bitte poste 'EXPLAIN SELECT ...' –

+0

Ich bearbeitete meinen Post und fügte die EXPLAIN-Abfrage hinzu, ich frage mich, ob es eine "allgemeine Ordnung nach Fehler" mit mysql ist, ich möchte das gleiche auf Mariadb testen, aber ich bin nicht sicher, dass mysql 5.7 Funktion sind noch implementiert – jess