2017-02-12 4 views
3
SELECT * 
FROM Movies 
WHERE studioName = ‘Disney’ AND year = 1990; 

これらの索引はどれくらい役立ちますか?SQLの索引の基礎を理解する

CREATE INDEX YearIndex ON Movies(year); 
CREATE INDEX StudioIndex ON Movies(studioName); 
CREATE INDEX YSIndex ON Movies(year,studioName); 
CREATE INDEX SYIndex ON Movies(studioName,year); 

WHERE句がyear = 1990の場合、各インデックスはどの程度助けになりますか?

年のインデックスを作成することは、映画が作成された年月が長いため、実際には役立ちます。そのため、検索は大幅に最小限に抑えられます。

Studioname 

でも、学年よりも多くの年があるため、助けになります。明らかに、検索は、前の2

studioname,year 

良いが、以前ほど良好ではない以上によって最小化されるので、

year,studioname 

は、この場合、より良い選択です。

WHERE句が< 1990の場合、各インデックスはどれくらいの助けになりますか?

この場合、1990年よりも小さい年をすべて検索する必要があるため、studionameのインデックスを作成すると、1年あたりのインデックス作成に役立ちます。したがって、年にインデックスを作成すると、1990年未満のすべての年のパス、私はstudioname、年の索引付けは、より良い選択肢だと思う。

これを正しく考える方法はありますか?

+0

(year、studioName)と(studioName、year)の両方のインデックスを比較している場合は同等かもしれませんが、少なくともPostgresではインデックスの最初の列を検索するのは、 (索引の接頭辞を読み取ることができるため)2番目のものです。 「1990年未満のすべての年」が何を意味するのかはわかりません。 – Ryan

+0

どのDBMS? Moviesテーブルのサイズはどれくらいですか?提案された各インデックスのカーディナリティはどのくらいですか? – cschneid

+0

1990年未満のすべての年。私はeveryという言葉の使用が誤解を修正すると思います。"毎年1990年未満" – daniel

答えて

2

あなたが正しいです、(year、studioName)のインデックスが最適です。両方の列に条件がある場合、高速検索が可能です。

年のみを検索し、studioNameを検索しない2番目のクエリがある場合は、同じインデックスが役立ちます。

ただし、(studioName、year)のインデックスしかなく、特定の年のみを検索した場合、インデックスは役に立たないでしょう。

電話帳を考えてください。あなたは姓で人を検索することができます。なぜなら、その人の本がどのようにソートされているからです。また、名字で人を検索することもできます。この本はさらに役立ちます。

しかし、指定されたファーストネームの人のみを検索すると、その書籍のソート順はあまり役に立ちません。

あなたは、私のプレゼンテーションを好きHow to Design Indexes, Really、またはそれを提示する私のビデオかもしれません:https://www.youtube.com/watch?v=ELR7-RdU9XU

プレゼンテーションは、MySQLのに合わせたが、アイデアの多くはBツリー構造を使用してインデックスを実装する任意のデータベースに適用されます。

+0

あなたの答えをありがとう、私は2番目の質問のタイプミスを検出しました。 – daniel