73

非常に頻繁にSELECT x, y, z FROM table WHERE x LIKE '%text%' OR y LIKE '%text%' OR z LIKE '%text%'クエリを実行する MySQL テーブルがあります。スピードアップに役立つインデックスはありますか?

テーブルには数百万のレコードがあります。検索を高速化する何かがあるとすれば、データベース ファイルによるディスク使用量とINSERTandDELETEステートメントの速度に深刻な影響を与えるでしょうか? (UPDATE決して実行されません)

更新:投稿後すぐにLIKE、クエリでの使用方法に関する多くの情報と議論を見てきました。ソリューションで使用する必要があることを指摘したいと思いますLIKE '%text%'(つまり、探しているテキストの先頭と末尾に % ワイルドカードが追加されます)。セキュリティなどの多くの理由から、データベースもローカルである必要があります。

4

9 に答える 9

82

テキスト列の場合、インデックスは左から N 文字のインデックスを作成することで機能するため、インデックスを使用してもクエリの速度は向上しません。LIKE '%text%' を実行すると、テキストの前に可変数の文字が存在する可能性があるため、インデックスを使用できません。

あなたがすべきことは、そのようなクエリをまったく使用しないことです。代わりに、MySQL が MyISAM テーブルでサポートする FTS (全文検索) などを使用する必要があります。また、MyISAM 以外のテーブルに対してこのようなインデックス システムを自分で作成するのは非常に簡単です。単語とその関連 ID を実際のテーブルに格納する別のインデックス テーブルが必要なだけです。

アップデート

MySQL 5.6 以降の InnoDB テーブルで全文検索が可能です。

于 2010-01-11T14:10:15.013 に答える
27

インデックスは先頭のワイルドカードとのテキスト マッチングには役立ちません。インデックスは次の目的で使用できます。

LIKE 'text%'

でも、それじゃつまらないと思います。このタイプのクエリでは、検索できるレコードの量を拡大したい場合は、全文検索プロバイダーを検討する必要があります。私の好みのプロバイダーはSphinxで、非常にフル機能で高速です。Luceneも一見の価値があるかもしれません。MyISAM テーブルのフルテキスト インデックスも機能しますが、最終的に大量の書き込みがあるデータベースに対して MyISAM を追求することはお勧めできません。

于 2010-01-11T14:09:36.937 に答える
21

検索条件がワイルドカードで始まる場合、インデックスを使用してクエリを高速化することはできません。

LIKE '%text%'

インデックスは、次の形式の検索用語に使用できます (選択性によっては使用される場合もあります)。

LIKE 'text%'

于 2010-01-11T14:08:33.277 に答える
12

場合によっては、参照しているフィールドが空であるか定数が含まれていることが多い場合、like/rlike と一緒にインデックスを使用してクエリを高速化できることを付け加えておきます。

その場合、固定値で「and」句を追加することにより、インデックスを使用してアクセスされる行を制限できるようです。

通常は多くのタグが含まれていない巨大なテーブルで「タグ」を検索するためにこれを試しました。

SELECT * FROM objects WHERE tags RLIKE("((^|,)tag(,|$))" AND tags!=''

タグにインデックスがある場合、検索される行を制限するために使用されていることがわかります。

于 2013-11-26T14:59:42.400 に答える
6

mysql5.1 を mysql5.7 にアップグレードしてみてください。

私は約70,000件のレコードを持っています。そして、次の SQL を実行します。

select * from comics where name like '%test%'; 

mysql5.1では 2000msかかります。また、mysql5.7 または mysql5.6では200msかかります。

于 2017-06-06T04:45:09.493 に答える