21

3列にフルテキストインデックスを追加する場合、3列に1つの単一インデックスを追加しますか、それとも3つの個別のインデックスを追加しますか?

現時点では、次のようにFULLTEXTを使用しているため、これを尋ねます。

ALTER TABLE myTable ADD FULLTEXT all3colsIndex (col1,col2,col3);
SELECT * FROM myTable WHERE MATCH (col1, col2, col3) AGAINST ('word');

検索インターフェイスにユーザーオプションを追加しました。ユーザーは、検索から列の1つを削除できます。したがって、インデックスを失うことなくこれを行うことができます。ここでは、3つの列のうち2つだけを使用しています。

ALTER TABLE myTable ADD FULLTEXT all3colsIndex (col1,col2,col3);
If (UserOptionRemoveCol == "selected") {
    SELECT * FROM myTable WHERE MATCH (col1, col2) AGAINST ('word');
} else {
    SELECT * FROM myTable WHERE MATCH (col1, col2, col3) AGAINST ('word');
}

または、2つの列と3つの列に新しいFULLTEXTインデックスを作成する必要がありますか?

ALTER TABLE myTable ADD FULLTEXT all3colsIndex (col1,col2,col3);
ALTER TABLE myTable ADD FULLTEXT 2colsIndex (col1,col2);
4

3 に答える 3

11

CREATE FULLTEXT INDEXのマニュアルを見ると、次のように繰り返すことで複数の列を指定できることがわかりますcolumn_name

CREATE FULLTEXT INDEX ON table_name (column_name1 [...], column_name2 [...]) ...

この情報を考えると、3つの列にまたがる単一のインデックスが作成されると思います。さらに、複合インデックスに関しては、左から右のルールで機能すると想定しています(次のステートメントの実行プランを確認して、これを確認します)。したがって、複合インデックスを(col1, col2, col3)使用するには、この順序で複合インデックスを選択する必要があります(SELECT col1, col2 ...)。呼び出す場合col2は、インデックスを使用しません。

于 2012-09-11T02:28:11.930 に答える
7

タイプFULLTEXTのインデックスは1つだけ作成されます。そのインデックスは、必要に応じて複数の列に「またがる」でしょう。ただし、インデックス自体は、単語ほど列にインデックスを付けていません。ドキュメントから:

InnoDB FULLTEXTインデックスは、転置インデックス設計になっています。転置インデックスには、単語のリストが格納され、単語ごとに、その単語が含まれるドキュメントのリストが格納されます。[...]

3つの列をグループ化する1つのFULLTEXTを作成する場合、または1つだけをグループ化する3つのFULLTEXTを作成する場合、これらの列は実際にはFULLTEXTメタデータテーブルのエントリで構成されます。

受信ドキュメントがトークン化されると、個々の単語(「トークン」とも呼ばれます)が、位置情報および関連するドキュメントID(DOC_ID)とともにインデックステーブルに挿入されます。

基本的に、複数列のFULLTEXTインデックスと複数の単一列のFULLTEXTインデックスは同じように機能するようです。これは、単語の格納が元の列の分離から抽象化されているためです。

于 2016-11-22T23:33:11.307 に答える
5

MySQLでは、使用する予定の列のセットごとに個別のインデックスを作成する必要があります(自然言語検索を使用している場合。これは、ブール検索では異なる場合があります)。

マニュアルから:

自然言語の全文検索の場合、MATCH()関数で指定された列は、テーブルの一部のFULLTEXTインデックスに含まれている列と同じである必要があります。[...]タイトルまたは本文を個別に検索する場合は、列ごとに個別のFULLTEXTインデックスを作成する必要があります。

于 2014-11-07T14:47:02.453 に答える