0

MySQL データベースで INDEX を使い始めたばかりで、考えていることがうまくいくかどうか少し確信が持てません。大量のテキストを格納できる TEXT フィールドがあり、別の id INT フィールドとともに検索する必要があります。たとえば、id_column フィールドに INDEX があり、text_column に FULLTEXT インデックスがある場合、MySQL は次のようなクエリで両方を使用しますか?

SELECT * FROM notes WHERE id_column='123' AND MATCH(text_column) AGAINST(search_text)

??

次に、組み合わせて検索するために頻繁に使用できる列のグループがあります。これらの列に複数列の INDEX を作成すると、使用される列がインデックス内で左から右に並んでいる場合、インデックスは機能します。しかし、ユーザーが B などの特定の列を除外し、(A、B、C、D) のようなインデックスで A、B、D を使用して検索するとどうなりますか ???

4

3 に答える 3

0

質問 1 の場合:

はい、クエリは両方のインデックスを使用します。 FULLTEXTただし、インデックスはややこしい場合があるため、MySQL のドキュメントをよく読んでEXPLAINクエリで使用し、インデックスが適切に利用されていることを確認することをお勧めします。

質問 2 の場合:

複数列のインデックスがある場合、インデックスには、使用するクエリと同じ順序で同じ列が含まれている必要があります。したがって、あなたの例では、インデックスは利用されません。

EXPLAINは、クエリがインデックスを使用する方法を理解するための非常に強力なツールであり、頻繁に使用することをお勧めします (特に、プログラムで生成されたクエリで)。 http://dev.mysql.com/doc/refman/5.0/en/explain.html

于 2013-07-27T20:28:14.357 に答える
0

このクエリを考えると:

SELECT * FROM notes
    WHERE id_column='123'
      AND MATCH(text_column) AGAINST(search_text)

オプティマイザが(私の知る限り)それを実行する唯一の方法は、

  1. を使用FULLTEXT(text_column)して検索の 2 番目の部分を実行し、次に
  2. のないものを除外しますid_column='123'。このステップではインデックスは使用されません。

これは、フルテキスト以外のインデックスを混在FULLTEXTさせる場合の一般的なルールです。最初に FULLTEXT を使用します。他のインデックスは使用されません。

ただし...複雑なクエリを高速化するトリックを次に示します。

SELECT b.*
    FROM (
        SELECT id   -- assuming this is the PRIMARY KEY
            FROM notes
            WHERE MATCH(text_column) AGAINST(search_text)
         ) AS a
    JOIN notes AS b   -- "self join"
        ON b.id = a.id    -- just the PK
    JOIN ((other tables)) ON ...
    WHERE ((other messy or bulky stuff)) ...

アイデアは、サブクエリを使用して小さな値 (ID) の短いリストに要約し、その後戻って (またはさらに JOIN して) かさばる内容を取得することです。

いくつかの単純なクエリに最適な複合インデックスを構築するには、私のインデックス クックブックを参照してください。

于 2015-11-26T07:30:23.750 に答える
0

MySQL が 1 つのクエリで同じテーブルに対して 2 つのインデックスの両方を使用するという保証はありません。一般的に、いいえ。ただし、両方のインデックスを検索して結果を結合する「インデックス マージ」がアクティブになる場合もあります。

ただし、すべてのクエリでこれができるわけではありません。この機能については、http: //dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.htmlを参照してください。

多列インデックスについては、A列、B列、C列、D列に索引があり、A列、B列、D列に対して検索を行う場合、その索引を使用することができますが、それは、それが範囲を絞り込む場合に限られます。列Aと列Bの条件に基づいて検索します。

EXPLAIN を使用して「ken_len」フィールドを見れば、この証拠を見ることができます。key_len は、その複数列インデックスで使用される列の合計バイト数になります。たとえば、A、B、C、D が 4 つの 4 バイト整数である場合、key_len は最大 16 になる可能性があります。ただし、A と B のみが使用される場合、key_len は 8 になります。

于 2013-07-27T21:04:01.940 に答える