2010-08-19 20 views
1
CREATE INDEX alias_pub_idx2 
    ON info.palias 
    USING btree 
    (publisher_id, player_id, pub_player_id); 

CREATE INDEX alias_pub_idx3 
    ON info.palias 
    USING btree 
    (player_id); 

第一包括三列;后者只包括一个。我认为它们是多余的 - 第一个btree索引就足够了,但我对PostgreSQL索引方法并不熟悉。思考?PostgreSQL指数 - 是多余的?

+0

这有效吗?最后我听说,PostgreSQL不支持覆盖索引,这就是'alias_pub_idx2'。 – 2010-08-19 22:01:04

+0

这就是我最初想到的,OMG--但它们不覆盖索引 - info.palias必须是schema.table语法。 – 2010-08-19 22:05:58

+1

是的,对不起,info.palias是schema.table .. – Wells 2010-08-19 22:06:18

回答

8

PostgreSQL多列索引是“排序”的,这意味着只有当player_idalias_pub_idx2中提到的第一列时,这才是多余的。

然而,这将是多余的:

CREATE INDEX alias_pub_idx2 
    ON info.palias 
    USING btree 
    (publisher_id, player_id, pub_player_id); 

CREATE INDEX alias_pub_idx3 
    ON info.palias 
    USING btree 
    (publisher_id); /* first column of another index => waste of space */ 
+0

所以说如果player_id是更多连接的列(到目前为止),它应该是索引中的第一列,或者有它自己的独立指数? – Wells 2010-08-19 22:31:05

+0

@ Wells是的,没错。从文档中:“当领先(最左边的)列有限制时,索引是最有效的” – KeatsPeeks 2010-08-19 22:46:16

+0

好;谢谢!我很感激。 – Wells 2010-08-19 23:09:24

0

无论指数时,其他多余的 - 对一个info.palias查询,查找特定player_ids将有利于在第一第二个索引,如果PUBLISHER_ID是不是也一个标准。

0

使用B树

BTREE indexes are ordered,这就是为什么你的第二个指标是多余的:第一列是相同的,可以在所有的查询,其中player_id是一种条件下使用。