適切な正規化を行った後も、テーブルにインデックスを付ける必要がありますか?これはパフォーマンスにどのように影響しますか?適切な正規化の後、パフォーマンスに何らかの影響を与えるでしょうか?
主キーと外部キーがすでにある場合、通常はどの列にインデックスが付けられますか?
データベースを正規化することはすでに効果があるようです。しかし、索引付けがデータベースに与える影響をスキップしたかもしれません。これはクエリが使用されている場合にのみ効果がありますか?これはどのように機能/実行し、データベースを改善しますか?
はい。実際、インデックスにもっと注意を払う必要があるかもしれません。正規化は約最適なストレージです。複雑な結合を使用したより複雑なクエリが使用されるため、これは取得速度と相反することがよくあります。高速な検索速度を必要とするデータベースを保守している人々は、データを非正規化したり、データをわずかに正規化されていない構造に配置して、検索を容易にすることがあります。
インデックス付けがデータベースのパフォーマンスにどのような影響を与えるかを誤解していると思います。
インデックスはデータベースに役立ちますfind行。インデックスは特別なデータ構造であり、追加のディスク領域と挿入および更新時のパフォーマンスと引き換えに、データベースエンジンが一致する行に移動できるようにします。
それらは最新の状態に保つために余分なスペースとコスト(ごくわずか)のパフォーマンスを必要とするため、データベース設計者はアプリケーションとクエリパターンに合わせて明示的にインデックスを作成する必要があります。
インデックスはデータベースの正規化と直交しています。
はい、正規化後もインデックスが必要です。
作業しているテーブルは、正規化前のテーブルと同じくらいのメリットがあります。実際には、それ自体は同じです。テーブルです。
ただし、考慮しなければならないことの1つは、インデックスを使用することで、データをより速く見つけることができます。データベースの設計を正規化することは常に適切ですが、パフォーマンス上の理由から、実装を非正規化する必要がある場合があります。しかし、それはケースバイケースでのみです。
はい。
インデックスは、データの検索を高速化する方法です。一部のクエリは主キーによるもので、通常はデータベースエンジンによって暗黙的にインデックスが作成されますが、他のクエリは他の列を使用する可能性があります。多くの場合、一部のクエリは一意ではないため正規化後に主キーになれない列で検索します。そのような列にインデックスを付ける必要があるでしょう。
作成するインデックスを知る方法は1つだけです。アプリケーション内のすべてのクエリを取り、それらの代表的なサンプルパラメータを見つけて、データベースエンジンにクエリプランを表示させます(すべてのデータベースエンジンにはEXPLAIN
、EXPLAIN QUERY PLAN
または同様のコマンド。エンジンによって呼び方が異なります)、どのくらいの時間がかかるかをテストします。遅いインデックスを高速化するインデックスを作成するよりも。また、リソースの浪費を避けるために試したが役に立たなかったインデックスを再度ドロップすることを忘れないでください。
インデックスは通常、最小のテーブル以外のすべてに必要です。ほとんどすべての外部キーにインデックスを作成する必要があります。FKを設定するだけでインデックスが作成されるわけではありません(少なくとも一部のデータベースでは、dbのドキュメントを確認してください)。 where句で頻繁に結合したり、where句で使用するフィールドは、メリットがあるもの(たとえば、ブール値がメリットにならないようにデータに一定の可変性が必要なもの)とインデックス付けが可能なフィールドである場合は、インデックス付けする必要があります。
ただし、すべてのインデックスは、selectsを高速化する一方で挿入/更新/削除を遅くするため、慎重にインデックスを選択してください。
インデックスは、データベースで許容可能なパフォーマンスを得るのに重要です。
3番目の正規形では、すべての主キーのインデックスが必ず必要になります。
他のインデックスが必要かどうかは、データベースの使用方法によって異なります。たとえば、特定の郵便番号で顧客を定期的に検索する場合は、顧客テーブルのZip_code列にインデックスを付けることをお勧めします。