最近、インデックスの素晴らしさを学び、パフォーマンスが劇的に向上しました。しかし、私が学んだすべてのことを考えると、この質問に対する答えを見つけることができないようです。
インデックスは素晴らしいですが、なぜすべてのフィールドにインデックスを付けて、テーブルを信じられないほど高速にできないのでしょうか。これを行わないのには十分な理由があると思いますが、30フィールドテーブルの3つのフィールドはどうでしょうか。30フィールドで10?どこに線を引くべきか、そしてその理由は?
最近、インデックスの素晴らしさを学び、パフォーマンスが劇的に向上しました。しかし、私が学んだすべてのことを考えると、この質問に対する答えを見つけることができないようです。
インデックスは素晴らしいですが、なぜすべてのフィールドにインデックスを付けて、テーブルを信じられないほど高速にできないのでしょうか。これを行わないのには十分な理由があると思いますが、30フィールドテーブルの3つのフィールドはどうでしょうか。30フィールドで10?どこに線を引くべきか、そしてその理由は?
回答:
インデックスはメモリ(RAM)の領域を占有します。インデックスが多すぎるか、または大きすぎるため、DBはそれらをディスクとの間で交換する必要があります。また、挿入時間と削除時間も増加します(各インデックスは、挿入/削除/更新されたすべてのデータについて更新する必要があります)。
あなたは無限の記憶を持っていません。すべてのインデックスがRAMに収まるようにする=良い。
あなたには無限の時間はありません。インデックスを作成する必要のある列のみにインデックスを作成すると、挿入、削除、更新のパフォーマンスへの影響が最小限に抑えられます。
行が更新、挿入、または削除されるたびに、すべてのインデックスを更新する必要があることに注意してください。したがって、インデックスが多いほど、書き込み操作のパフォーマンスが低下します。
また、すべてのインデックスはさらにディスクスペースとメモリスペースを消費するため(呼び出された場合)、読み取り操作も遅くなる可能性があります(大きなテーブルの場合)。 これをチェック
CRUDのニーズのバランスを取る必要があります。テーブルへの書き込みが遅くなります。どこに線を引くかについては、それはデータへのアクセス方法(ソートフィルタリングなど)によって異なります。
インデックス作成は、ドライブとRAMの両方から割り当てられたスペースをより多く消費しますが、パフォーマンスも大幅に向上します。残念ながら、それがメモリ制限に達すると、システムはドライブスペースを解放し、パフォーマンスにリスクをもたらします。実際には、挿入や検索(WHERE句)のいずれでもない、あらゆる種類のデータトラバースアルゴリズムに関与しないと思われるフィールドのインデックスを作成しないでください。しかし、そうでなければあなたはすべきです。デフォルトでは、すべてのフィールドにインデックスを付ける必要があります。インデックスを解除することを検討する必要があるフィールドは、クエリがモデレーターのみによって使用される場合であり、速度も必要でない場合を除きます。
この答えは私の個人的な意見に基づいています
2番目の質問は、停止する境界線に関するものでした。最初に、いくつかの数学的な計算を行います。すべてのフィールドにインデックスを付けると、すべてのテーブルが並べ替えられるL個の新しいインデックステーブルを取得する場合、テーブルにL個のフィールドがあるN行があるとします。インデックスフィールドのデータの意味のある方法、一見すると、テーブルがWの重みである場合、100個の大きなテーブルがある場合、W * 2(1テラは2テラになります)になります(テーブル番号があったプロジェクトですでに作業していました)約1800テーブル)このスペースの100倍(100テラ)を無駄にします。これは賢明な方法とはかけ離れています。
すべてのテーブルにインデックスを適用する場合、インデックスの更新が1つの更新トリガーであり、すべてのインデックスが更新されると考える必要があります。
これから私はあなたがこのシナリオであなたが持っていると結論づけます。この時間を失うと、選択または更新でそれを失うことが望ましいです。なぜなら、インデックス付けされていないフィールドを選択すると、すべてのフィールドで別の選択がトリガーされないためです。インデックス付けされていません
何を索引付けするのですか?
foreign-keys:に基づく必要があります
主キー:誰かがこれを読んでこのケースで役立つかどうかはまだわかりません
他のフィールド:最初の自然な答えは残りのフィールドの半分です理由:インデックスを増やす必要がある場合、ベストインデックスからそれほど遠くない場合インデックスを少なくする必要がある場合も、インデックスがなく、すべてのインデックスが付いていることがわかっているため、それほど遠くないはずです。また悪いです。
この3つの点から、K個のキーで構成されるL個のフィールドがある場合、制限は((L-K)/2)+K
L / 10程度の多少の差があると結論付けることができます
この答えは私の論理と個人の価格に基づいています
テーブルのすべての列にインデックスを付けることはお勧めできません。これにより、テーブルの読み取りが非常に高速になりますが、書き込みも非常に遅くなります。すべての列にインデックスが付けられているテーブルに書き込むには、そのテーブルに新しいレコードを配置してから、各列の情報を独自のインデックステーブルに配置します。