O índice espacial pode fazer parte de um índice de várias colunas?

8

Este manual aqui é extremamente obscuro e nem fornece algumas instruções SQL de exemplo: http://dev.mysql.com/doc/refman/5.6/en/column-indexes.html

Outra maneira de reformular a pergunta é a seguinte:

Sabemos que podemos ter um índice com várias colunas. E se os índices dessas colunas forem de tipo diferente? Digamos que a primeira coluna seja espacial, a outra seja pesquisa completa, etc. Podemos fazê-lo no mysql? (Bônus: podemos fazê-lo no mongodb, se você souber)

Digamos que você tenha uma tabela de myisam

Possui uma coluna LATLONG que contém pontos

Possui uma coluna FULLTEXT que contém palavras no "negócio"

Você deseja consultar primeiro por LATLONG e, em seguida, dentro do LATLONG correspondente, deseja filtrar com base na coluna FULLTEXT.

Suponho que você precisará de um índice de várias colunas.

Mas qual é o comando SQL?

Como sabemos, o mysql sempre usará o índice fulltextsearch primeiro, se possível.

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

Demora muito tempo, enquanto 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

é mais rápido porque eu digo ao mysql para usar o índice latlong_2, que é uma consulta espacial.

Bem, digamos que eu quero ter um índice de várias colunas. Latlong_2 e FULLTEXTSEARCH. Eles estão fora do tipo diferente. LatLong_2 é espacial e FULLTEXTSEARCH é um índice de pesquisa de texto completo. Qual comando SQL devo executar?

user4951
fonte

Respostas:

3

Não, você não pode.

Um índice, no MySQL, será

  • um BTREEíndice único ou de várias colunas.

  • um HASHíndice (disponível apenas para MEMORYtabelas), que pode abranger várias colunas.

  • um SPATIALíndice (disponível apenas para MyISAMtabelas).

  • um FULLTEXTíndice (disponível para MyISAMe 5.6.4+ InnoDBtabelas), que pode abranger várias colunas de CHAR, VARCHARou TEXTtipo.

Você não pode combinar esses tipos.

ypercubeᵀᴹ
fonte