Kann der räumliche Index Teil eines Index mit mehreren Spalten sein?

8

Dieses Handbuch hier ist äußerst unklar und enthält nicht einmal einige SQL-Beispielanweisungen: http://dev.mysql.com/doc/refman/5.6/en/column-indexes.html

Eine andere Möglichkeit, die Frage neu zu formulieren, ist die folgende:

Wir wissen, dass wir einen Index mit mehreren Spalten haben können. Was ist, wenn die Indizes dieser Spalten unterschiedlichen Typs sind? Angenommen, die erste Spalte ist räumlich, die andere ist Volltextsuche usw. Können wir dies in MySQL tun? (Bonus: Können wir das in Mongodb tun, wenn Sie es wissen?)

Angenommen, Sie haben einen Myisam-Tisch

Es hat eine LATLONG-Spalte, die Punkte enthält

Es hat eine FULLTEXT-Spalte, die Wörter im "Geschäft" enthält.

Sie möchten zuerst nach LATLONG abfragen und dann innerhalb des passenden LATLONG nach der Spalte FULLTEXT filtern.

Ich nehme an, Sie benötigen einen mehrspaltigen Index.

Aber was ist der SQL-Befehl?

Wie wir wissen, verwendet MySQL nach Möglichkeit immer zuerst den Volltextsuchindex.

Diese Abfrage:

SELECT BusinessID as ID ,  
  111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from tableauxiliary 
use index (LatLong_2)
WHERE
    MBRContains(
    GeomFromText (
        'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
        ),
        Latlong)=1  
    AND Prominent >15 
    AND MATCH FullTextSearch AGAINST ('sea*' IN BOOLEAN MODE)
    ORDER BY
  Distance
LIMIT
  0, 45

Dauert lange, während diese Abfrage:

SELECT BusinessID as ID ,  
  111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from tableauxiliary 
use index (LatLong_2)
WHERE
    MBRContains(
    GeomFromText (
        'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
        ),
        Latlong)=1  
    AND Prominent >15 
    AND MATCH FullTextSearch AGAINST ('sea*' IN BOOLEAN MODE)
    ORDER BY
  Distance
LIMIT
  0, 45

ist schneller, weil ich mysql anweise, stattdessen den latlong_2-Index zu verwenden, bei dem es sich um eine räumliche Abfrage handelt.

Angenommen, ich möchte einen mehrspaltigen Index haben. Latlong_2 und FULLTEXTSEARCH. Sie sind von unterschiedlichem Typ. LatLong_2 ist räumlich und FULLTEXTSEARCH ist ein Volltextsuchindex. Welchen SQL-Befehl sollte ich ausführen?

user4951
quelle

Antworten:

3

Nein, das kannst du nicht.

Ein Index in MySQL ist entweder

  • ein BTREEein- oder mehrspaltiger Index.

  • Ein HASHIndex (nur für MEMORYTabellen verfügbar ), der mehrere Spalten umfassen kann.

  • ein SPATIALIndex (nur für MyISAMTabellen verfügbar ).

  • ein FULLTEXTIndex (verfügbar für MyISAMund 5.6.4+ InnoDBTabellen), das kann mehrere Spalten überspannen CHAR, VARCHARoder TEXTTyp.

Sie können diese Typen nicht kombinieren.

ypercubeᵀᴹ
quelle