Postgresql中的索引

Postgresql中的索引,postgresql,indexing,Postgresql,Indexing,我们在postgresql中有一个表用户(userid、username、category、pincode) 如果我们创建如下索引: 在用户上创建索引类别\u idx(类别) 在用户上创建索引类别_pincode_idx(类别,pincode) 并将表用户查询为: select * from users where category = somevalue; 将应用哪个索引?执行以下语句将显示执行计划器将根据当前数据集选择哪个索引: explain select * from users w

我们在postgresql中有一个表用户(userid、username、category、pincode)

如果我们创建如下索引:

  • 在用户上创建索引类别\u idx(类别)
  • 在用户上创建索引类别_pincode_idx(类别,pincode) 并将表用户查询为:

    select * from users where category = somevalue; 
    

    将应用哪个索引?

    执行以下语句将显示执行计划器将根据当前数据集选择哪个索引:

    explain select * from users where category = somevalue;
    

    请注意,如果数据量不足以保证使用索引,规划人员甚至可能会选择不使用索引,因为对极少数行进行完整表扫描可能会更快。

    第一个索引是多余的。任何可以使用第一个索引的查询也可以使用第二个索引。您可能还想阅读以下内容:我想问的另一件事是:如果有一个表users(userid、username、category、pincode)的主键是(userid、category、pincode),那么需要/不需要在这些主键列上单独/作为一个整体创建索引,Postgres会自动为此创建一个唯一的索引:因此,这意味着如果列pincode是主键的一部分,则无需单独在列pincode上显式创建索引。我不是这么说的。如果您有一个仅在pincode上具有条件的查询,那么它可能是有意义的。请务必阅读手册中有关索引的章节