web-dev-qa-db-ja.com

MySQL-すべてのフィールドにインデックスを付けないのはなぜですか?

最近、インデックスの素晴らしさを学び、パフォーマンスが劇的に向上しました。しかし、私が学んだことすべてでは、この質問に対する答えを見つけることができないようです。

インデックスは優れていますが、なぜすべてのフィールドにインデックスを付けてテーブルを非常に高速にすることができないのでしょうか?これを行わない正当な理由があると確信していますが、30フィールドテーブルの3つのフィールドについてはどうでしょうか。 30フィールドに10個?どこで線を引く必要があり、なぜですか?

90
Vael Victus

インデックスはメモリ(RAM)のスペースを占有します。インデックスが多すぎるか大きすぎると、DBはインデックスをディスクと交換する必要があります。また、挿入時間と削除時間も増加します(挿入/削除/更新されたすべてのデータに対して、各インデックスを更新する必要があります)。

無限のメモリはありません。すべてのインデックスがRAM = good。

無限の時間はありません。インデックス付けが必要な列のみをインデックス付けすると、挿入/削除/更新のパフォーマンスヒットが最小限に抑えられます。

105
Brian Roach

行が更新、挿入、または削除されるたびに、すべてのインデックスを更新する必要があることに注意してください。したがって、インデックスが多いほど、書き込み操作のパフォーマンスが低下します。

また、すべてのインデックスは追加のディスク領域とメモリ領域(呼び出されたとき)を占有するため、読み取り操作も遅くなる可能性があります(大きなテーブルの場合)。 チェックアウト

21
AndyMac

CRUDのニーズのバランスを取る必要があります。テーブルへの書き込みが遅くなります。どこに線を引くかについては、データがどのようにアクセスされるかに依存します(並べ替えフィルターなど)。

9
Smandoli

インデックス作成は、ドライブとRAMの両方からより多くの割り当てられたスペースを占有しますが、パフォーマンスも大幅に向上します。残念ながら、メモリ制限に達すると、システムはドライブ容量を放棄し、パフォーマンスを危険にさらします。実際には、挿入や検索(WHERE句)のいずれでもない、あらゆる種類のデータトラバースアルゴリズムに関係しないと思われるフィールドにはインデックスを付けないでください。しかし、そうでなければあなたはすべきです。デフォルトでは、すべてのフィールドにインデックスを付ける必要があります。インデックス解除を考慮する必要があるフィールドは、クエリがモデレーターのみによって使用される場合です。ただし、スピードが必要な場合を除きます。

2
Lionel Jerinho

テーブル内のすべての列にインデックスを付けることはお勧めできません。これにより、テーブルの読み取りが非常に高速になりますが、書き込みもはるかに遅くなります。すべての列にインデックスが付けられたテーブルに書き込むには、そのテーブルに新しいレコードを入れてから、各列の情報を独自のインデックステーブルに入れる必要があります。

1
Rachid Sakara

この答えは私の個人的な意見に基づいています

2番目の質問は、停止する境界についてでした。まず、いくつかの数学計算を行います。すべてのフィールドにインデックスを付ける場合、テーブルにLフィールドを持つN行があり、すべてのテーブルがインデックスフィールドのデータの意味のある方法、一見すると、テーブルがWウェイトの場合、100個の大きなテーブルがある場合、W * 2になります(1テラは2テラになります)(テーブル番号があったプロジェクトで既に働いていました)約1800テーブル)このスペースを100倍(100テラ)無駄にしますが、これは賢明とは程遠いです。

すべてのテーブルにインデックスを適用する場合、インデックスの更新が1つの更新トリガーであったことを考慮する必要があります。

このことから、このシナリオでは、この時間を失う場合は、選択または更新で失うことをお勧めします。インデックス化されていないフィールドを選択すると、すべてのフィールドで別の選択がトリガーされないためです索引付けされていません

インデックス付けするもの

外部キー: に基づいている必要があります

主キー:これを読んだ人がこの場合に役立つかどうかはまだわかりません

その他のフィールド:最初の自然な答えは残りのフィールドの半分です理由:インデックスを作成する必要がある場合、インデックスを作成する必要がある場合、インデックスを作成する必要がありますまた悪いです。

この3点から、K個のキーで構成されるLフィールドがある場合、制限は((L-K)/2)+K L/10前後

この答えは、私の論理と個人的な価格に基づいています