在单个postgres表中生成多个索引

时间:2018-10-19 18:00:01

标签: mysql postgresql

我有一些源语法需要从MySQL转换为postgreSQL。似乎在postgres中没有类似的东西可以在单个表上生成多个索引。另外,我很难理解为什么会在一个表上生成多个索引:

ALTER TABLE concept 
  ADD PRIMARY KEY (table_id), 
  ADD UNIQUE INDEX idx_table_table_id (table_id), 
  ADD INDEX idx_table_code (table_code), 
  ADD INDEX idx_table_v_id (v_id), 
  ADD INDEX idx_cd_id (d_id), 
  ADD INDEX idx_table_class_id (table_class_id);

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您可以将其分解为单独的语句。还要注意,创建主键将在该列上隐式创建一个唯一索引,因此您也不应尝试显式创建一个主键:

ALTER TABLE concept ADD PRIMARY KEY (table_id); 
ALTER TABLE concept ADD INDEX idx_table_code (table_code);
ALTER TABLE concept ADD INDEX idx_table_v_id (v_id);
ALTER TABLE concept ADD INDEX idx_cd_id (d_id);
ALTER TABLE concept ADD INDEX idx_table_class_id (table_class_id);

答案 1 :(得分:0)

在PostgreSQL中,每个约束是单独添加的。参见ALTER TABLE

您的单个​​DDL(数据定义语言)语句需要细分为:

  • 约束根据规则对数据进行检查:

    ALTER TABLE concept ADD PRIMARY KEY (table_id);
    
  • 索引对于加快某些查询非常有用。小心使用:

    CREATE INDEX idx_table_code ON concept (table_code);
    
    CREATE INDEX idx_table_v_id ON concept (v_id);
    
    CREATE INDEX idx_cd_id ON concept (d_id);
    
    CREATE INDEX idx_table_class_id ON concept (table_class_id);
    

    注意:仅在需要时创建索引。我的(非常个人的)经验法则是每张桌子不超过10。如果达到那个水平,那么我需要仔细考虑一下我在做什么。

答案 2 :(得分:0)

正如前面提到的那样,您应该为每个索引创建一个CREATE INDEX语句。

关于表上的多重索引...问题在于,有时单个表上的查询可能非常不同。在您的示例中,使用基于table_code列或基于d_id列的谓词创建sql并不相同。

这就是为什么有时更好的方法是同时为两者创建索引。似乎为两个列创建一个索引更容易,更好,但是您应该认为索引列的顺序非常重要,如果两个列的值都很多,则更重要。同样,table_code或d_id列也不一定总是在SQL上。