3

次MYSQL文は、0.577251秒かかります:私のMysql LIKEステートメントはどれくらいの速さですべきですか?

SELECT synonym_group FROM synonym WHERE name LIKE '%ak%' 

名前はVARCHAR(250)のフィールドです。 現在、シノニム・データベース表には356,187レ​​コードがあります。 データ:21 MB。インデックス:23 MB。合計サイズ:45 MB。 1行あたりのバイト数:67.

したがって、妥当な時間は0.577251秒ですか?そうでない場合は、何であり、何をすべきか?私はこのタイプの質問でいくつかのスレッドを読んできました。私が見ることができる主な解決策は、スフィンクスのようなものを使うことです。

私のテーブルのいくつかのフィールドはおそらく無関係です。不要なフィールドを削除することで、1行あたりのバイト数を半分に減らすと、2倍の速さで検索できますか?

ありがとうございます。

+0

このクエリを使用して1つのレコードを検索しているのですか、複数のレコードを返すことができますか?一致すると思われる文字列の例を1つまたは2つ入力してください。 –

答えて

4

akが単語である場合は、FULLTEXTインデックスは(あなたが最小の単語の長さを調整する場合は、下記を参照)に働くだろう。

ので、FULLTEXTインデックスを持つ 'AK' の検索がこれに一致します

  • 'これはそれをアラスカ州。'
  • 'AK'
  • 'AK。なんでも。'
  • '何でも。 AK。

しかし、それはこの一致しません:

  • 'BAK'
  • 'AKT'

を一致させるために、単語の境界があるように持っています。

フルテキスト検索のデフォルトのminimum word lengthは4文字です。だから、あまりにも短すぎるので、 'ak'のFULLTEXT検索はまだできませんでした。あなたは最小単語長さの設定を下げることができますが、あなたはFULLTEXTインデックスを混乱させたくない 'the'、 'and'、および他のすべての3つの短い単語で終わるでしょう。

唯一の実行可能なオプションかもしれません。先頭のワイルドカード('%ak')を使用すると、インデックスを使用してレコードを見つけることができません。すべての行をスキャンする必要があります。それでも、あなたはカバー索引を持っているかどうかを調べるために索引を使用します。

だから、あなたのクエリのために:あなたは(name, synonym_group)上の複数列、カバー、インデックスを持っている場合は

SELECT synonym_group FROM synonym WHERE name LIKE '%ak%' 

は、それが実際にはまだなく、伝統的な意味では、クエリに答えるためにインデックスを使用します。 MySQLはインデックスをスキャンしますが、実際のテーブルデータをスキャンするよりも一般的に高速です(テーブルスキャン)。さらに、理想的なシステムでは、すべてのインデックスをRAMに格納するのに十分なRAMがあるため、ディスクの代わりにメモリをスキャンするだけです。

したがって、カバリングインデックスでは、行のサイズは影響を受けません。

カバーインデックスがないと、ディスクがさらに移動する必要があるため、行のサイズがスキャン速度に影響します。

テーブルスキャンを終了する場合は、テーブルのデフラグを行い、固定長の行(VARCHARではなくCHAR)を使用することをお勧めします。

4

LIKEの演算子を%で始めると、選択にインデックスが使用されません。

はい、時間は正常です。

+0

多くの感謝!フィールドにFULLTEXTインデックスを入れてFULLTEXTの検索速度を上げることはできますか? lucene/sphinxはスピードアップしますか? – oyvey

+0

@oyvey:マーカスの答えを見てください。 –

3

最初の%での検索では、インデックスを使用できないため、テーブル全体をスキャンする必要があります(テーブルサイズが大きくなると悪くなります)。実際のCPUのドレインが各行の文字列を循環しているので、列の数を減らすことはおそらく役に立ちません。

あなたは、フルテキスト検索とインデックスの使用を検討すべきである。この場合

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

関連する問題