【问题标题】:How do you define indexes normally in PostgreSQL (coming from MySQL)您如何在 PostgreSQL 中正常定义索引(来自 MySQL)
【发布时间】:2011-03-06 00:13:18
【问题描述】:

与其他所有内容一样,似乎 PostgreSQL 具有更强大/更复杂的表索引。也许有人可以帮助我了解索引列的默认方式。

默认情况下,我的意思是整数/布尔列,它们在 90% 的时间内用于过滤表结果。

在 MySQL 中,我只需在与该列同名的列上创建一个索引。我不确定使用的是什么类型(btree?)或将索引命名为与列相同的含义 - 但它有效。

现在转移到 PostgreSQL,我想知道使用相同名称命名索引是否有任何问题(或者任何原因都不是)。另外,我想知道应该为 int/bool 值使用哪种类型的索引。

【问题讨论】:

    标签: database postgresql indexing


    【解决方案1】:

    在大多数情况下,默认索引类型(btree)就可以了。

    默认索引名称(如果您未在 CREATE INDEX 语句中指定)基于表和列名称,通常类似于 table_column _idx。 IIRC 索引名称在架构中必须是唯一的,因此如果您将索引命名为与列相同的名称,如果架构中的多个表使用相同的列名称,您可能会遇到麻烦。

    【讨论】:

    • 好的,还有一个问题——当你运行你的查询时,你必须使用索引名还是你可以使用列名并且PostgreSQL会知道自动使用匹配的索引?
    • @Xeoncross:PostgreSQL 知道哪些索引可用,哪些要使用。
    • 太棒了。哦,我忘了 - 串行/大串行索引是否像 MySQL 主键一样自动索引?
    • @Xeoncross 否,但通常您将列定义为 some_id serial primary key 并将列标记为主键会导致在其上创建索引。您可以有一个非索引的串行列,或将其作为其他索引的一部分,但根据我的经验,您通常将串行列设为主键。
    • 感谢@araqnid,我不知道我需要将primary key 添加到串行列定义中。这可以解释为什么我的表显示 0 个索引。
    【解决方案2】:

    如果要索引布尔值,请使用条件索引。大多数布尔值要么是均匀分布的,在这种情况下,仅布尔值的索引几乎不会为您带来任何好处,因为您将以一种或另一种方式阅读一半。但是,如果您有一个布尔值,其中 99.999% 的行是一个值,而其他 0.001% 的行是另一个值,那么在 0.001% 上创建索引是有意义的:

    create index mostly_true on tablename (somefieldIwantwhenboolfieldisfalse)
      where boolfield is false;
    

    请注意,这也适用于多列索引。

    create index mostly_true on tablename (col1,col2) where boolfield is false;
    

    【讨论】:

    • 有趣,所以您是说用 50/50 布尔值索引表不是一个好主意?将布尔值列表保存在索引中是否可以让 PostgreSQL 不必读取每一行来查找布尔值?
    • 没有。 Postgres 无论如何都必须读取行,因为它的设计。索引只会告诉您在哪里查找它,而不是告诉您该值是否对您的交易可见。
    • 请注意,postgresql 的更高版本现在支持覆盖索引,所以这个建议可能会也可能不会过时。
    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 2013-04-18
    • 2011-02-11
    • 2016-11-08
    • 2017-04-15
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多