L'indice spaziale può far parte di un indice a più colonne?


8

Questo manuale qui è estremamente poco chiaro e non fornisce nemmeno alcune istruzioni SQL di esempio: http://dev.mysql.com/doc/refman/5.6/en/column-indexes.html

Un altro modo per riformulare la domanda è il seguente:

Sappiamo di poter avere un indice con più colonne. Che dire se gli indici di quelle colonne sono di tipo diverso? Supponiamo che la prima colonna sia spaziale, l'altra sia fulltextsearch, ecc. Possiamo farlo in mysql? (Bonus: possiamo farlo in mongodb, se ti capita di saperlo)

Supponi di avere un tavolo myisam

Ha una colonna LATLONG che contiene punti

Ha una colonna FULLTEXT che contiene parole nel "business"

Prima si desidera eseguire una query per LATLONG, quindi all'interno della LATLONG corrispondente si desidera filtrare in base alla colonna FULLTEXT.

Suppongo che avrai bisogno di più indici di colonna.

Ma cos'è il comando SQL?

Come sappiamo, mysql utilizzerà sempre prima l'indice fulltextsearch, se possibile.

Questa query:

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

Richiede molto tempo, mentre questa query:

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

è più veloce perché dico a mysql di usare invece l'indice latlong_2, che è una query spaziale.

Bene, dire che voglio avere un indice a più colonne. Latlong_2 e FULLTEXTSEARCH. Sono di diverso tipo. LatLong_2 è spaziale e FULLTEXTSEARCH è un indice di ricerca full-text. Quale comando SQL dovrei eseguire?

Risposte:


3

No, non puoi.

Un indice, in MySQL, lo sarà

  • un BTREEindice singolo o multi-colonna.

  • un HASHindice (disponibile solo per le MEMORYtabelle), che può comprendere più colonne.

  • un SPATIALindice (disponibile solo per le MyISAMtabelle).

  • un FULLTEXTindice (disponibile per MyISAMe 5.6.4+ InnoDBtabelle), che può estendersi su diverse colonne di CHAR, VARCHARo TEXTtipo.

Non puoi combinare questi tipi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.