L'index spatial peut-il faire partie d'un index à plusieurs colonnes?

8

Ce manuel ici est extrêmement peu clair et ne fournit même pas quelques exemples d'instructions SQL: http://dev.mysql.com/doc/refman/5.6/en/column-indexes.html

Une autre façon de reformuler la question est la suivante:

Nous savons que nous pouvons avoir un index avec plusieurs colonnes. Et si les index de ces colonnes sont de type différent? Disons que la première colonne est spatiale, l'autre est fulltextsearch, etc. Pouvons-nous le faire dans mysql? (Bonus: pouvons-nous le faire dans mongodb, si vous le savez)

Dis que tu as une table myisam

Il a une colonne LATLONG qui contient des points

Il a une colonne FULLTEXT qui contient des mots dans le "business"

Vous souhaitez d'abord interroger par LATLONG, puis dans le LATLONG correspondant, vous souhaitez filtrer en fonction de la colonne FULLTEXT.

Je suppose que vous aurez besoin d'un index à plusieurs colonnes.

Mais qu'est-ce que la commande SQL?

Comme nous le savons, mysql utilisera toujours l'index fulltextsearch en premier si possible.

Cette requête:

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

Prend beaucoup de temps, alors que cette requête:

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

est plus rapide car je dis à mysql d'utiliser à la place l'index latlong_2, qui est une requête spatiale.

Eh bien, disons que je veux avoir un index à plusieurs colonnes. Latlong_2 et FULLTEXTSEARCH. Ils sont de type différent. LatLong_2 est spatial et FULLTEXTSEARCH est un index de recherche plein texte. Quelle commande SQL dois-je exécuter?

user4951
la source

Réponses:

3

Non, tu ne peux pas.

Un index, dans MySQL, sera soit

  • un BTREEindex à une ou plusieurs colonnes.

  • un HASHindex (disponible uniquement pour les MEMORYtables), qui peut s'étendre sur plusieurs colonnes.

  • un SPATIALindex (disponible uniquement pour les MyISAMtables).

  • un FULLTEXTindex (disponible pour MyISAMet 5.6.4+ InnoDBtables), qui peut s'étendre sur plusieurs colonnes de CHAR, VARCHARou TEXTtype.

Vous ne pouvez pas combiner ces types.

ypercubeᵀᴹ
la source