Tampaknya tabel InnoDB tidak mengizinkan pencarian pada beberapa indeks teks lengkap dalam MATCH()
yang sama kondisi.
Di sini bidang Anda tidak semuanya termasuk dalam tabel yang sama, oleh karena itu bidang-bidang tersebut dicakup oleh indeks yang berbeda. Perhatikan batasan yang sama berlaku jika Anda memiliki tabel seperti ini:
CREATE TABLE t (
f1 VARCHAR(20),
f2 VARCHAR(20),
FULLTEXT(f1), FULLTEXT(f2)
) ENGINE=InnoDB;
SELECT * FROM t
WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row
Itu sepertinya pencarian teks lengkap hanya dapat mencari pada indeks teks lengkap pertama yang ditemukan tetapi ini hanya sesuatu yang saya kurangi dari pengalaman ini , tolong jangan anggap remeh ini.
Intinya adalah Anda harus membagi pencarian Anda untuk menggunakan satu indeks teks lengkap tunggal per MATCH()
klausa:
SELECT * FROM auction, user, gallery, ...
WHERE
MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR
MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR
MATCH(user.field1, user.field2, user.field3) AGAINST...
Ini adalah ilustrasi kemungkinan kueri jika Anda memiliki dua indeks berbeda pada auction
dan satu di user
. Anda perlu menyesuaikannya dengan struktur Anda yang sebenarnya (harap posting deskripsi tabel Anda jika Anda membutuhkan panduan lebih lanjut).
Perhatikan ini hanya berlaku untuk tabel InnoDB. Menariknya, tabel MyISAM tampaknya tidak menunjukkan batasan yang sama .
Pembaruan:ternyata ini bug di mesin InnoDB
, diperbaiki di 5.6.13/5.7.2. Contoh di atas sekarang gagal dengan "Tidak dapat menemukan indeks FULLTEXT yang cocok dengan daftar kolom". Memang, tidak ada indeks di (f1, f2)
, tapi satu di (f1)
dan satu lagi di (f2)
. Seperti yang disarankan changelog :
Patut dicatat bahwa meskipun kueri tersebut mengembalikan hasil yang benar yang ditetapkan dengan MyISAM, kueri tersebut berjalan lebih lambat dari yang diperkirakan, seperti mereka diam-diam mengabaikan indeks teks lengkap yang ada .