【问题标题】:postgresql index usage - Pluses And Minusespostgresql 索引使用 - 优缺点
【发布时间】:2011-05-03 21:26:25
【问题描述】:

我使用 python/django 作为编程语言/框架。我需要知道的完全是关于 postgresql 和索引...

对于使用 django 的人来说,可能知道 Content Type 和 Django Admin Log。但很快,管理员日志正在记录用户操作。我还使用它来记录站点内执行的所有操作。所以它有 1.000.000+ 条记录。我使用 sql 查询来过滤结果,到这里就可以了……

问题是,我使用两个字段从不同的表中选择数据。其中之一是,内容类型,它存储了相关的数据库表信息和字段被索引...

其他字段是,object id,里面存放的是相关对象的id,字段类型是varchar,字段不被索引...

使用示例是:

Select from django_admin_log where content_type_id=15 and object_id="12343545";

由于 content_type_id=15 点我的 blog_texts 表和相关对象的 id 是 12343545,我可以很容易地得到相关数据...

但是object_id没有被索引,并且表有1.000.000+条记录,像我上面写的查询需要很多执行时间。

在 object_id 中使用索引有什么好处和坏处。利大于弊吗?

更新:我没有关于管理日志表的更新。它只记录所有用户操作...每天将 40.000-45.000 条记录插入表中。并且系统在一天的 2/3 时间里真的很忙,大约 15-16 小时(从早到晚)。因此,在上午 8 点到晚上 11 点期间插入了 45.000 条记录...

那么从这个角度来看,如果我创建索引,会不会导致数据库过多的过载?

更新 2:还有一个问题。另一个包含 2.000.000 多条记录且带有布尔字段的表。字段类似于“将其显示”,它与其他过滤条件一起使用。为这样的布尔字段创建索引是否合乎逻辑。

第二个条件是,在包含 1.000.000 条记录的表中同时索引布尔值和日期时间字段...

对这两个条件使用索引好不好?

【问题讨论】:

    标签: indexing postgresql


    【解决方案1】:

    只是为了澄清......

    对于这个特定的 SQL,您应该使用包含两列(content_type_idobject_id)的一个索引——连接索引。

    在这种情况下,您可以仅删除 content_type_id 上的现有索引 - 新索引将能够处理仅过滤 content_type_id 的查询以及过滤两个列的查询。

    两个索引 - 现有的一个和一个仅在 object_id 上的新索引 - 可能不会为此查询提供最佳结果。

    编辑:如果您通过object_id 列扩展现有索引,则插入的性能损失可以忽略不计,但您的选择工作会更快。

    EDIT 2:如果你有这样的陈述

    WHERE bool = true
    

    还有其他类似的:

    WHERE bool = true AND date > something
    

    我建议先在 BOOL 上建立连接索引,然后再在 DATE 上建立连接索引。

    用于不等式比较的列应移到索引的末尾。

    但是,根据您的数据,不索引 BOOL 字段可能有意义。例如如果所有行中有 95% 为真,则上述语句不会过滤太多。在这种情况下,索引可能会降低 select 语句的性能。然而,一个好的优化器只会忽略索引。插入/更新/删除成本仍然存在。


    阅读更多关于concatenated indexes in my free eBook的信息。

    【讨论】:

      【解决方案2】:

      在 object_id 中使用索引有什么好处和坏处。

      好处是查询速度更快。缺点是插入速度较慢。

      利大于弊吗?

      我敢说是的,他们会的,因为更快的页面加载带来的 Google Ads 收入的增加肯定值得您在发布博客条目时多等待一秒钟。

      更新:

      从您的帖子中我可以得出结论,该表在高峰时段每秒接收大约 4 条记录。

      1M 表上每秒记录 4 条记录对于任何体面的服务器来说都不是问题,因此我相信您可以安全地创建索引。

      最好在(object_id, content_type_id)上创建一个复合索引。

      【讨论】:

      • 要添加到 Quassnoi 的答案中,您还将在一般情况下对 UPDATES 进行打击,但看看您的情况,我怀疑 object_id 是否会得到更新。看看你的情况,唯一受 INSERTS 和 UPDATES 影响的人就是你,所以似乎可以安全地接受打击并让你的用户拥有速度。
      猜你喜欢
      • 2017-08-02
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      相关资源
      最近更新 更多