1

500 万を超えるレコードを含む大規模なデータベースがあります。このデータベースには 3 つのフィールド (ID、名前、テキスト) があり、フィールドIDには主キーがあり、フィールドnameにはFULLTEXTインデックスがあります。

フィールドをシークするサイト用の検索エンジンを作成したいのですが、インデックスnameを使用しFULLTEXTていますが、4文字未満のキーワードを受け入れないという欠点があるため、それを削除INDEX KEYしてフィールドに a を置きname、次を使用することにしましたリクエスト:

EXPLAIN SELECT * FROM table WHERE locate ('search', name) > 0;

問題は、このアプリケーションがインデックス KEY フィールド名を使用せず、次の要求を使用していることです。

EXPLAIN SELECT name FROM table WHERE locate ('search', name) > 0;

すべてのフィールドを選択すると、MYSQL がインデックスを使用INDEX KEYしない理由がわかりません。

あなたの意見では、この問題を解決する方法と、可能であればより良い代替案を教えてください。

4

1 に答える 1

1

mysql構成で、フルテキストインデックスの最小文字数を設定できます。私は現在、例を見つけるために自分のコンピューターを使用していませんが、このページが役立つ場合があります:http: //dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

アップデート:

私のPCに戻ります。したがって、mysqlがSELECT name FROM table WHERE locate ('search', name) > 0;ステートメントでインデックスを使用する理由については非常に簡単です。名前フィールドにインデックスを作成すると、インデックスには実際の名前フィールド、つまり名前フィールドの値が含まれるため、名前フィールドのみを選択すると、mysqlは検索を実行し、インデックスから必要なすべてのデータを取得できます。したがって、このシナリオでは、mysqlは1つの操作を実行して、インデックスで検索された値に一致するデータを取得し、それらを返す必要があります。

SELECT name FROM table WHERE locate ('search', name) > 0;ただし、他のデータフィールドも必要です。名前フィールドの値のみがインデックスに格納されるため、mysqlはインデックスを読み取り、次にテーブルを読み取って他のフィールドを取得する必要があります。したがって、このシナリオでは、mysqlはインデックスの値と一致し、テーブルの値を見つけてそれらを返す必要があります。これは、mysqlが2つの操作を実行する必要があることを意味します。これは、前のシナリオと比較して2倍の作業量です。

500万行はまだ非常に小さいため、mysqlがテーブルをループして行を取得する方がおそらく高速です。行を追加すると、テーブルをループするコストがインデックスを読み取ってテーブルの値を検索するコストよりも高くなると、mysqlはおそらくインデックスの使用を開始します。

それが理にかなっていることを願っています。

于 2012-08-14T08:32:39.090 に答える