3
SELECT * FROM items WHERE caption LIKE 'name%' AND type = 'private' OR owner LIKE 'name%' type = 'private' ORDER BY uses DESC LIMIT 40;

可能なキー:items_caption、items_owner、items_typeキー:items_uses(explainコマンドを使用してこれらを取得)

そのクエリを実行するのに約1.8秒かかり、テーブルには100万を超えるレコードがあります。このクエリのインデックスを作成する方法がわかりません。また、ソースを制御できないため、クエリを変更できません。

4

3 に答える 3

2

'caption'で全文索引付けを行うことができ、クエリ時間が大幅に増加します。

ALTER TABLE items ADD FULLTEXT(caption,owner);

Mysql v 5.6以降は、innodbでの全文検索をサポートしています。 https://blogs.oracle.com/MySQL/entry/full_text_search_with_innodb

于 2012-07-30T19:35:18.143 に答える
1

それがどのように機能するかを確認するには、最初にExplainクエリを作成する必要があります。クエリの実行方法とテーブルの構造がわからない場合は、サポートできません。IE、@ chheploは、テキスト検索にインデックスを追加できると言っています

ALTER TABLE items ADD FULLTEXT(caption,owner);

ただし、DBの設計によって異なります。Mysql5.6を使用していて、エンジンがInnodbの場合は機能しません。テキストインデックスを作成するには、engine = MyISAMが必要です。また、explainを実行して表示する必要があります。 selectもそれを使用している場合。ただし、「LIKE」を回避すると高速になると思います。「%Query%」のようなパフォーマンスと全文検索のCONTAINSクエリ

よろしく

于 2012-07-30T19:45:49.123 に答える
1

select *を使用しているため、カバーインデックスを実際に実行することはできませんが、(caption、type)と(owner、type)に対して複合インデックスのペアを実行することはできます。

ALTER TABLE items ADD INDEX (caption, type);
ALTER TABLE items ADD INDEX (owner, type);

これにより、内部ポイントルックアップが削減されます。

LIKEと比較している値はワイルドカード(%)で始まらないため、全文検索は必要ないと思います。%で始まらない文字列と比較するいいねは、従来の高速bツリーインデックスを使用できます。'%name'のようにLIKEの先頭に%がある場合、これは当てはまりません。

また、検索する条件は次のとおりです。

キャプションLIKE'name%' AND type ='private'

また

所有者LIKE'name%' AND type ='private'

したがって、「ADD FULLTEXT(caption、owner)」は、caption句が失敗し、所有者とタイプで検索しようとした場合、あまり役に立ちません。

于 2012-07-30T19:46:10.317 に答える