InnoDBテーブルでは、同じMATCH()
内の複数のフルテキストインデックスを検索できないようです。 状態。
ここでは、フィールドがすべて同じテーブルに属しているわけではないため、異なるインデックスでカバーされています。次のようなテーブルがある場合も、同じ制限が適用されることに注意してください。
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
のように見えます 全文検索では、最初に検出された全文インデックスのみを検索できますが、これは私が差し引くものにすぎませんこの経験から 、これを当然のことと思わないでください。
つまり、MATCH()
ごとに1つのフルテキストインデックスを使用するように検索を分割する必要があります。 条項:
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...
これは、auction
に2つの異なるインデックスがある場合に考えられるクエリの例です。 1つはuser
にあります 。実際の構造に適合させる必要があります(さらにガイダンスが必要な場合は、テーブルの説明を投稿してください)。
これはInnoDBテーブルにのみ適用されることに注意してください。興味深いことに、MyISAMテーブルは同じ制限を示していないようです 。
更新:これはInnoDBエンジンのバグ
であることが判明しました 、5.6.13/5.7.2で修正されました。上記の例は、「列リストに一致するFULLTEXTインデックスが見つかりません」で正しく失敗します。実際、(f1, f2)
にはインデックスがありません 、ただし(f1)
に1つ もう1つは(f2)
にあります 。 変更ログのアドバイスに従って> :
このようなクエリはMyISAMで正しい結果セットを返しますが、既存のフルテキストインデックスを黙って無視します 。