そのフィールドに複数列のインデックスが既に存在する場合、テーブルに新しい単一列のインデックスを追加する必要がありますか?


10

とに複数列のUNIQUEインデックスを持つテーブルが_job_id__あり__keyword_id__ます。

その列__job_id__に対してクエリを頻繁に実行する場合、別のインデックスを追加する必要もありGROUP BYますか?

(1億行になると、しばらく時間がかかることがあります。これが、単に実行する代わりに求めている理由です)


実際の質問が遅いクエリに関するものである場合は、SHOW CREATE TABLE SHOW TABLE STATUS SHOW VARIABLES LIKE '%buffer%' EXPLAIN SELECT ...どのくらいのRAMが利用可能ですか?考えられる理由はたくさんあります。ほとんどは、これらのアイテムを見ることで見つけることができます。
リックジェームズ

回答:


5

いいえ、まったくありません!!! 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ファイルが肥大化するだけです。

要約すると、追加のインデックスを作成する必要はありません!!!


本気ですか?この男は別のことを示唆しています:stackoverflow.com/questions/179085/…または、これはMySQLとMSSQLで異なりますか?
Tadej 2017

4

インデックスは、並べ替えgroup by減らすことによってのみ操作を高速化できます。これは、使用されるインデックスがクラスター化インデックスであるか、少なくともクラスター化インデックスと同じ先頭列を持っている場合により効率的です。これらすべてにおいて、MySQLにはhash group by通常、インデックスの利点をまったくバイパスする操作に相当するものがないと想定しています。おそらく他の誰かがこれを確認できます。

これが句job_id内の唯一の列でありgroup by、どちらもクラスター化インデックスではないことを前提として、個別のインデックスを作成することにはわずかな利点があります。インデックスは小さくなり、スキャンするとI / Oの生成が少なくなります

-編集-

指標として二次インデックスに含まれていないクラスタ化インデックスキーに対して定義されたすべての主キーフィールドが含まれ、上のインデックスは、job_id唯一のインデックスよりも小さくなるjob_id, keyword_id場合keyword_id、クラスタ化インデックスの一部ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.