26

このテーブルを持っている:

CREATE TABLE `example` (
`id` int(11) unsigned NOT NULL auto_increment,
`keywords` varchar(200) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

次のクエリを最適化します。

SELECT id FROM example WHERE keywords LIKE '%whatever%'

テーブルはInnoDBです(したがって、現時点ではFULLTEXTはありません)。これは、このようなクエリを最適化するために使用するのに最適なインデックスですか?

簡単なことを試しました:

ALTER TABLE `example` ADD INDEX `idxSearch` (`keywords`);

しかし、explainクエリは、クエリが「whatever%」の代わりに「whatever%」である場合、テーブル全体をスキャンする必要があることを示しています。このインデックスは良好に機能しますが、それ以外の場合は値がありません。

これをinnoDB用に最適化する方法はありますか?

ありがとう!

4

2 に答える 2

53

インデックスは、文字列の最初から最後に向かって作成されます。type句を使用するLIKE 'whatever%'と、MySQLはこれらの開始ベースのインデックスを使用してwhatever非常に迅速に検索できます。

ただし、に切り替えるとLIKE '%whatever%'、文字列の先頭にあるアンカーが削除されます。検索語が文字列の先頭に固定されなくなったため、開始ベースのインデックスを使用できなくなりました。文字列は中央のどこかに「フローティング」であり、フィールド全体を検索する必要があります。クエリLIKE '%...でインデックスを使用することはできません。

そのため、フルテキストインデックスは、そのタイプの使用法向けに設計されているため、「フローティング」検索のみを実行している場合に使用します。

重要な注意:バージョン5.6.4以降、InnoDBはフルテキストインデックスをサポートするようになりました。したがって、少なくとも5.6.4にアップグレードできない場合を除いて、InnoDB*および全文検索の使用を妨げるものは何もありません。

于 2012-04-27T16:19:47.827 に答える
1

驚くべきことに、インデックスを作成することlike '%abc%'で、私の場合のクエリのクエリを高速化することもできました。

を実行MySQL 5.5.50してUbuntu(すべてをデフォルトのままにして)、多くの列を含むテーブルを作成し、100,000ダミーエントリを挿入しました。1つの列に、32文字の完全にランダムな文字列を挿入しました(つまり、すべて一意です)。

いくつかのクエリを実行してから、この列にインデックスを追加しました。シンプルな

select id, searchcolumn from table_x where searchcolumn like '%ABC%'

~2 seconds インデックスなし0.05 seconds インデックスありの結果を返します。

これは上記の説明(および他の多くの投稿)に適合しません。その理由は何でしょうか?

編集 私はEXPLAIN出力をチェックしました。出力には行がと表示されますが100,000、追加情報は「Using where; Using index」です。では、どういうわけか、DBMSはすべての行を検索する必要がありますが、それでもインデックスを利用できますか?

于 2017-01-18T10:18:54.463 に答える