我在Postgres中创建了一个包含这两个表的非常简单的数据库:
歌手( ID ,姓名,姓氏,生日)
歌曲( ID ,姓名,专辑,年份,歌手)
表中的ID Singer是串行类型,它是主键。
表格中的ID 歌曲是串行类型,它是主键。
专栏"歌手"在Song表中引用Singer表中的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
我在"歌手"上创建了哈希索引。 Song表中用于优化连接操作的列:
CREATE INDEX ON song USING hash (singer);
但是,如果我执行查询并使用explain / analyze,我的索引似乎不会被使用。
所以我的问题是:这样的索引是否有意义?
如果没有,这是因为专栏&#34;歌手&#34;在歌曲表中是一个引用歌手表中的主键(id)的外键,Postgres会自动在主键上创建索引(因此我不需要自定义索引,因为基本上它是完全相同的事情)?< / p>
答案 0 :(得分:0)
首先:永远不要使用hash
索引,因为它们会在服务器崩溃时损坏,请参阅the documentation。
是的,这个索引肯定会有所帮助,因为在这种情况下,优化器应选择嵌套循环连接并将song
作为内部表。
请注意,在您定义外键约束的列上创建索引几乎总是正确的,否则DELETE
上的任何singer
都将导致 song
上的顺序扫描。