¿Puede el índice espacial ser parte de un índice de columnas múltiples?

8

Este manual aquí no es muy claro y ni siquiera proporciona algunas declaraciones SQL de muestra: http://dev.mysql.com/doc/refman/5.6/en/column-indexes.html

Otra forma de reformular la pregunta es la siguiente:

Sabemos que podemos tener un índice con múltiples columnas. ¿Qué pasa si los índices de esas columnas son de diferente tipo? Digamos que la primera columna es espacial, la otra es búsqueda de texto completo, etc. ¿Podemos hacerlo en mysql? (Bonificación: ¿podemos hacerlo en mongodb, si lo sabes?)

Digamos que tienes una mesa de myisam

Tiene una columna LATLONG que contiene puntos.

Tiene una columna FULLTEXT que contiene palabras en el "negocio"

Desea consultar por LATLONG primero, y luego dentro del LATLONG coincidente que desea filtrar según la columna FULLTEXT.

Supongo que necesitarás un índice de múltiples columnas.

Pero, ¿cuál es el comando SQL?

Como sabemos, mysql siempre usará el índice de búsqueda de texto completo primero si es posible.

Esta consulta:

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

Lleva mucho tiempo, mientras que esta consulta:

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

es más rápido porque le digo a mysql que use el índice latlong_2 en su lugar, que es una consulta espacial.

Bueno, digamos que quiero tener un índice de múltiples columnas. Latlong_2 y FULLTEXTSEARCH. Están fuera del tipo diferente. LatLong_2 es ​​espacial y FULLTEXTSEARCH es un índice de búsqueda de texto completo. ¿Qué comando SQL debo ejecutar?

user4951
fuente

Respuestas:

3

No puedes.

Un índice, en MySQL, será

  • Un BTREEíndice de una o varias columnas.

  • un HASHíndice (disponible solo para MEMORYtablas), que puede abarcar varias columnas.

  • un SPATIALíndice (disponible solo para MyISAMtablas).

  • un FULLTEXTíndice (disponible para MyISAMy 5.6.4+ InnoDBtablas), que puede abarcar varias columnas de CHAR, VARCHARo TEXTtipo.

No puedes combinar estos tipos.

ypercubeᵀᴹ
fuente