代码之家  ›  专栏  ›  技术社区  ›  Mp0int

postgresql索引使用-优缺点

  •  2
  • Mp0int  · 技术社区  · 14 年前

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

    对于那些使用django的人,可能知道内容类型和django管理日志。但很快,管理日志会记录用户操作。我还使用它来记录站点内执行的所有操作。所以它有超过1000.000条记录。我使用sql查询来过滤结果,到目前为止还可以。。。

    问题是,我使用两个字段从不同的表中选择数据。其中一个是content type,它存储相关的数据库表信息,字段被索引。。。

    另一个字段是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没有索引,并且表有1000.000多条记录,像我上面写的查询需要大量的执行时间。

    在对象id中使用索引有什么好处和缺点?好处是否比缺点大?

    所以从这个角度来看,如果我创建索引,会不会导致数据库过亮?

    更新2:还有一个问题。另一个具有2000.000+条布尔字段记录的表。字段类似于“wwill it be displayed”,它与其他筛选条件一起使用。为这样的布尔字段创建索引是否合乎逻辑。

    第二个条件是,将一个布尔值和一个DATETIME字段一起索引到一个表中,记录值为1.0万个…

    2 回复  |  直到 14 年前
        1
  •  1
  •   Markus Winand    14 年前

    只是为了澄清。。。。

    对于这个特定的SQL,您应该使用 content_type_id object_id

    在这种情况下,您可以删除现有的索引。 内容类型id 内容类型id 以及两列都被过滤的查询。

    两个指标——现有指标和新指标 对象id

    编辑 如果您将现有索引扩展为 列中,插入的性能损失可以忽略不计,但您的选择将工作得更快。

    编辑2

    WHERE bool = true
    

    还有一个是这样的:

    WHERE bool = true AND date > something
    

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

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


    阅读更多关于 concatenated indexes in my free eBook

        2
  •  1
  •   Quassnoi    14 年前

    在对象id中使用索引的优点和缺点是什么。

    利大于弊吗?

    我敢说,是的,他们会的,因为谷歌广告收入的增长,从更快的网页加载肯定值得额外的秒,你将不得不等待张贴博客条目。

    更新:

    4秒记录在 1M 对于任何一个好的服务器来说,表都不是问题,所以我相信您可以安全地创建索引。

    最好在 (object_id, content_type_id) .