web-dev-qa-db-ja.com

Varcharインデックス-ハッシュ値はそれをより速くしますか?

テーブルにVARCHAR(1000)列があります。一意であることが保証されない文字列が含まれます。 _WHERE IN_句の一部としてこの列を検索するクエリがあります。IN ('...')リストの値のリストは約100になります。最初の数か月。これにインデックスを付けると挿入が遅くなり、非常に大きなインデックスが作成される可能性があることを理解しています。

質問

  1. 値のハッシュを保存し、代わりにインデックスを付けて検索する方が高速でしょうか?
  2. 値が一意であることが保証されていない場合でも、それは理にかなっていますか?
  3. 値をハッシュすると長さが一定になる場合、インデックスを作成するとクエリが高速になりますか?

私はmysql 5.1を実行しており、INNODBエンジンを使用しています。

4
Peter Kelly

あなたが求めていることは少し困難です。理由は次のとおりです。

値のハッシュも保存し、代わりにインデックスを付けて検索する方が高速でしょうか?

ハッシュ列を作成してインデックスを作成することは、素晴らしいアイデアのように思えます。私は_March 03, 2013_に戻ることを提案しました: MySqlのVARCHARフィールドで可能なINDEX (提案#3を参照)

値が一意であることが保証されていない場合でも、それは理にかなっていますか?

これは、そのハッシュ列のカーディナリティに依存します。数百万行になるとおっしゃっていたので、これを数値で表現しましょう。

テーブルに対してSELECT COUNT(DISTINCT hashcolumn) ...を実行します。 100万行のテーブルの場合、この数は20を超える必要があります。つまり、各個別の値は50,000行(テーブル行の5%)以下でなければなりません。 50,000行を超える値があると、MySQLクエリオプティマイザーはインデックスの使用を拒否し、テーブル全体をスキャンして、そのハッシュ値の優先メソッドを作成します。

値をハッシュすると長さが一定になる場合、インデックスを作成するとクエリが高速になりますか?

はいとたぶん同時に言います。なぜ2つの答えですか?インデックスを作成し、長い列の代わりにハッシュ列を使用することは、すばらしいですMyISAMテーブルに対して。 InnoDBを使用しているとおっしゃっていました。

固定テキストと可変テキストの使用に関しては、InnoDBではなくMyISAMを使用します

エピローグ

テーブルがトランザクションでかなり頻繁に使用される場合、テーブルはInnoDBのままである必要があります。 MyISAMでアイデアをより有効に活用できます。ハッシュのアイデアを先に進めることができます。 PRIMARY KEYが単一の整数列であることを確認してください(20億行を超えることがわかっている場合はBIGINT。それ以外の場合はINT)。私はメジャーRAMアップグレードを行い、それに応じてInnoDBバッファープールサイズを増やします。

2
RolandoMySQLDBA