とに複数列のUNIQUE
インデックスを持つテーブルが_job_id__
あり__keyword_id__
ます。
その列__job_id__
に対してクエリを頻繁に実行する場合、別のインデックスを追加する必要もありGROUP BY
ますか?
(1億行になると、しばらく時間がかかることがあります。これが、単に実行する代わりに求めている理由です)
とに複数列のUNIQUE
インデックスを持つテーブルが_job_id__
あり__keyword_id__
ます。
その列__job_id__
に対してクエリを頻繁に実行する場合、別のインデックスを追加する必要もありGROUP BY
ますか?
(1億行になると、しばらく時間がかかることがあります。これが、単に実行する代わりに求めている理由です)
回答:
いいえ、まったくありません!!! MySQLクエリオプティマイザーは、必要なメインカラムがインデックスの左端にある場合に正しく動作します。そのようなインデックスを作成した場合、常にGROUP BY job_id、keyword_idを実行すると、MySQL Query Optimizerはそのインデックスを使用しないことを選択する場合があります。MySQL Query Optimizerは、job_idのみでレコードを収集する場合、インデックスを使用する場合と使用しない場合がありますが、いずれにせよ、冗長なインデックスがスペースを浪費しています。
テーブルがMyISAMの場合、そのようなインデックスを作成してもMYIファイルが膨らむだけです。
テーブルがInnoDBであり、innodb_file_per_tableが0の場合、そのようなインデックスを作成すると、ibdata1が膨らむだけです。
テーブルがInnoDBで、innodb_file_per_tableが1の場合、そのようなインデックスを作成すると、テーブルの.ibdファイルが肥大化するだけです。
要約すると、追加のインデックスを作成する必要はありません!!!
インデックスは、並べ替えgroup by
を減らすことによってのみ操作を高速化できます。これは、使用されるインデックスがクラスター化インデックスであるか、少なくともクラスター化インデックスと同じ先頭列を持っている場合により効率的です。これらすべてにおいて、MySQLにはhash group by
通常、インデックスの利点をまったくバイパスする操作に相当するものがないと想定しています。おそらく他の誰かがこれを確認できます。
これが句job_id
内の唯一の列でありgroup by
、どちらもクラスター化インデックスではないことを前提として、個別のインデックスを作成することにはわずかな利点があります。インデックスは小さくなり、スキャンするとI / Oの生成が少なくなります
-編集-
指標として二次インデックスに含まれていないクラスタ化インデックスキーに対して定義されたすべての主キーフィールドが含まれ、上のインデックスは、job_id
唯一のインデックスよりも小さくなるjob_id, keyword_id
場合keyword_id
、クラスタ化インデックスの一部ではありません。