Dapatkah indeks spasial menjadi bagian dari indeks beberapa kolom?

8

Manual ini di sini sangat tidak jelas dan bahkan tidak memberikan beberapa contoh pernyataan SQL: http://dev.mysql.com/doc/refman/5.6/id/column-indexes.html

Cara lain untuk mengulangi pertanyaan adalah sebagai berikut:

Kami tahu kami dapat memiliki indeks dengan banyak kolom. Bagaimana jika indeks kolom-kolom itu berbeda jenis? Katakanlah kolom pertama spasial, yang lain adalah fulltextsearch, dll. Bisakah kita melakukannya di mysql? (Bonus: dapatkah kami melakukannya di mongodb, jika Anda kebetulan tahu)

Katakanlah Anda memiliki meja myisam

Ini memiliki kolom LATLONG yang berisi poin

Ini memiliki kolom FULLTEXT yang berisi kata-kata di "bisnis"

Anda ingin melakukan query dengan LATLONG terlebih dahulu, dan kemudian dalam LATLONG yang cocok Anda ingin memfilter berdasarkan pada kolom FULLTEXT.

Saya kira Anda perlu beberapa indeks kolom.

Tapi apa perintah SQL?

Seperti yang kita ketahui, mysql akan selalu menggunakan indeks fulltextsearch terlebih dahulu jika memungkinkan.

Kueri ini:

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

Butuh waktu lama, sementara permintaan ini:

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

lebih cepat karena saya meminta mysql untuk menggunakan indeks latlong_2 sebagai gantinya, yang merupakan kueri spasial.

Nah, katakan saya ingin memiliki indeks beberapa kolom. Latlong_2 dan FULLTEXTSEARCH. Mereka dari tipe yang berbeda. LatLong_2 bersifat spasial dan FULLTEXTSEARCH adalah indeks pencarian teks lengkap. Apa perintah SQL yang harus saya jalankan?

pengguna4951
sumber

Jawaban:

3

Tidak bisa.

Indeks, di MySQL, akan menjadi

  • sebuah BTREEindeks-kolom multi-tunggal atau.

  • sebuah HASHindeks (tersedia hanya untuk MEMORYtabel), yang dapat span beberapa kolom.

  • sebuah SPATIALindeks (tersedia hanya untuk MyISAMtabel).

  • sebuah FULLTEXTindeks (tersedia untuk MyISAMdan 5.6.4+ InnoDBtabel), yang dapat span beberapa kolom dari CHAR, VARCHARatau TEXTjenis.

Anda tidak dapat menggabungkan tipe-tipe ini.

ypercubeᵀᴹ
sumber