2016-07-04 96 views
0

我在Postgres的做了一個非常簡單的數據庫包含這兩個表:postgres中的這個索引是否有意義?

歌手(ID,姓名,生日)

歌(ID,名稱,專輯,年份,歌手)

ID表中歌手屬於serial類型,它是它的主鍵。

ID表中宋是串行類型,它是它的主鍵。

宋表引用ID在歌手錶

我想檢索所有給定的歌手的歌曲(假設有ID = 3的歌手)列「歌手」和歌手的名字和姓

因此,我需要這樣的查詢:

SELECT song.name, song.album, song.year, singer.name, singer.surname 
FROM song, singer 
WHERE song.singer = singer.id AND singer.id = 3 

我在宋表中創建的「歌手」一欄,然後一個散列索引優化連接操作:

CREATE INDEX ON song USING hash (singer); 

然而,如果我執行查詢並使用解釋/分析,我的索引似乎不被使用。

所以我的問題是:像這樣的索引是否有意義?

如果不是,這是因爲歌曲表中的「歌手」列是引用歌手錶中的主鍵(id)的外鍵,並且Postgres自動在主鍵上創建索引(所以我的自定義索引不是因爲基本上它是完全相同的東西)?

回答

0

首先:從不使用hash索引,因爲它們在服務器崩潰時會損壞,請參閱the documentation

是,該指數有一定幫助,因爲優化應該選擇嵌套循環連接song在這種情況下,內表

注意,它幾乎總是建立在其上定義一個外鍵約束的列(S)的索引正確的事情,否則在任何singerDELETE導致一個順序掃描song

+0

對不起讓我們說我想要一個給定的歌手(只有一個)的所有歌曲 我原來的帖子寫的散列索引是否有意義呢? 我已經編輯了正確的查詢 – NoobNe0

+0

原來的帖子另外,我必須選擇哈希或btree索引。散列值對於訪問單個值非常有用,而btree適合訪問值的區間。 在這種情況下,需要特定的歌手,因此我選擇了散列索引。 – NoobNe0

+0

好的,我已經更新了答案。你應該永遠不要使用散列索引,因爲任何崩潰都會破壞你的數據庫。你對B-tree索引的理解不正確,在你的情況下它們工作得很好。 –

相關問題