2017-02-12 65 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 

會有幫助,但不如一年,因爲有更多的年份比studionames。

year,studioname 

在這種情況下,更好的選擇,因爲很明顯,搜索是通過超過前兩次

studioname,year 

是好的,但並不像以前一樣好最小化。

如果WHERE子句是年份< 1990,每個索引會有多大幫助?

studioname的索引將比年份索引更有幫助,因爲在這種情況下,我們必須查找比1990年少的所有年份,所以如果我們按年份索引,我們將不得不搜索1990年以後所有年份的路徑,所以我認爲在studioname上索引一年是更好的選擇。

這是想想這個的正確方法嗎?

+0

(year,studioName)和(studioName,year)索引可能是等價的,如果你正在查找它們兩個,並且至少在Postgres中,搜索索引的第一列只比搜索第二個(因爲它可以讀取索引的前綴)。不知道「所有年份比1990年少」是什麼意思。 – Ryan

+0

哪個DBMS? Movies表有多大?每個建議指數的基數是多少? – cschneid

+0

所有年份少於1990年。我認爲每個詞的使用都會解決被誤解的問題。「每年少於1990年」 – daniel

回答

2

你是對的,(年份,studioName)上的索引是最好的。當你在兩列都有條件時,它可以快速查找。

如果您有第二個查詢只搜索年份,但不是用於studioName,那麼相同的索引也會有所幫助。

但是,如果您只有(studioName,year)的索引,並且您只搜索特定年份,則索引將無濟於事。

想想電話簿。您可以按姓氏搜索人員,因爲這是書籍的排序方式。您還可以按姓氏和名字搜索人物,這本書可以提供更多幫助。

但是,如果您僅搜索具有給定名字的人,那麼本書的排序順序並不是很有幫助。

你可能會喜歡我的介紹,How to Design Indexes, Really,或者我提出它的視頻:https://www.youtube.com/watch?v=ELR7-RdU9XU

該演講爲MySQL量身定做的,但是很多的概念適用於實現使用B樹結構索引的數據庫。

+0

感謝您的回答,我在第二個問題中發現了一個錯字。 – daniel