1

私はこれが非常に基本的であり、データベースを使用している場所を考えると、おそらくこれを理解する必要があることを知っていますが、インデックスが実際に何であるかを完全には理解していません。

具体的には、ORMによって生成されたT-SQLを次に示します。FKを作成してから、そのインデックスを作成します。

インデックスを持つことは(ポジティブな意味で)何をし、それを除外することは(ネガティブな意味で)何をするのでしょうか?

-- Creating foreign key on [item_id] in table 'CakeStats'
ALTER TABLE [dbo].[CakeStats]
ADD CONSTRAINT [FK_CakeStat_Item]
    FOREIGN KEY ([item_id])
    REFERENCES [dbo].[Items]
        ([id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;

-- Creating non-clustered index for FOREIGN KEY 'FK_CakeStat_Item'
CREATE INDEX [IX_FK_CakeStat_Item]
ON [dbo].[CakeStats]
    ([item_id]);
GO
4

1 に答える 1

3

インデックスは、特定のデータをより高速に検索できるバランスの取れたツリーです。一般的な意味で何かを索引付けすることは、簡単に見つけられるようにマークすることです。参考書の後ろにある索引を視覚化します。アルファベット順にソートされているため、実際の情報がどこにあるかをすばやく見つけることができますが、本の後ろに余分なページがあり、大きく/厚くなります. インデックスするものが多いほど、それは大きくなります。クラスター化インデックスと非クラスター化インデックスの間にも違いがあります。上記の例は非クラスター化インデックスであるため、通常の本の内容に追加されます。クラスター化されたインデックスは、インデックスのキーによって並べ替えられた実際のコンテンツそのものです。

外部キーの場合、何かを外部キーにする場合、キーが強制される方法は、参照されるテーブル/列をチェックして、それが存在するかどうかを確認することです。外部キーにインデックスを設定すると、すべての行を 1 つずつ (n 回) 調べる必要がなく、ルックアップ (log(n) 回) が大幅に高速化されます。

あなたの例では、クエリが item_id に基づいて CakeStats を検索する場合にのみ、インデックスが役立ちます。実際には、Items(id) にもインデックスがあることが非常に重要です。そうしないと、item_id が CakeStats で挿入/削除/更新されるたびに、外部キーのチェックにコストがかかります。

于 2012-06-04T17:27:06.173 に答える