【问题标题】:Index a sum column索引总和列
【发布时间】:2010-10-01 01:49:34
【问题描述】:

为正在求和的列创建索引是否比没有索引快?

【问题讨论】:

    标签: mysql sql sql-server indexing sum


    【解决方案1】:

    抱歉,不清楚您在问什么。

    您是在问,它会加快诸如

    之类的查询吗
    SELECT product, sum(quantity) FROM receipts 
    GROUP BY product
    

    如果您添加了数量索引?

    如果这是问题,那么答案是否定的。一般来说,当您需要在众多行中查找几行时,索引会很有帮助;在这里你需要所有行,所以索引没有帮助。

    有一个晦涩的异常(很少适用,大多数数据库优化器可能不会费心实现这个技巧)。如果您的查询恰好是

    SELECT sum(foo) FROM bar
    

    ,在 foo 上有一个索引,bar 是一个有很多列的表,可以读取完整索引,比读取基础表产生的命中要小,直接从index - 根本不必触摸“真实”表!然而,这是一种相当罕见的情况,您需要测试一下您的优化器是否知道这样做,然后再过分依赖它。

    【讨论】:

    • +1 好建议:查看优化器生成的执行计划。
    • 这是否总是正确的 - 索引不会影响 SUM 性能?如果我们使用过滤器索引来指示值不为空怎么办?当我们使用 WHERE 子句对特定值求和时,索引会有帮助吗?
    • 我将 Mysql 5.7 与 innodb 一起使用,查询计划解释说,对于列的总和,优化器不会超出覆盖索引。
    • 优化并不是那么晦涩难懂。只有当您不需要来自外部的值时,Mysql 和 postgres 才会扫描索引。
    【解决方案2】:

    没有。索引通过限制需要多少检查来改进搜索。无论如何,聚合函数(count、max、min、sum、avg)必须遍历列中的所有条目。

    【讨论】:

    • 但是如果所有这些列都存在于索引本身中,则不需要访问实际的表,这使得总和比没有索引的情况更快
    【解决方案3】:

    如果你想让求和更快,你可以预先实现结果。在 Oracle 上使用Materialized Views,在 MS SQL 上使用Indexed Views

    关于您的具体问题“为正在求和的列创建索引是否比没有索引更快?”,答案是否定的。

    您的问题的答案取决于 Spencer 的回答:

    “无论如何,一个聚合函数(count、max、min、sum、avg)必须遍历列中的所有条目进行求和。”

    刚刚澄清了斯宾塞回答中列的上下文。不过他的回答是正确的。

    【讨论】:

      【解决方案4】:

      如果索引覆盖,通常会更快。快多少取决于表中列数与索引中列数之间的差异。此外,如果有任何过滤条件,它可能会更快。

      【讨论】:

        【解决方案5】:

        我发现在 where(productid here) 中对列进行索引有助于使用此查询:

        从收据中选择 productid, sum(quantity) WHERE productid = 1 GROUP BY productid

        添加索引后,我的一个查询从 45 秒变为几乎即时。

        【讨论】:

        • 产品ID单一,是否需要SELECT列表中的产品ID?
        • 是的,但正如 SquareCog 所说,向 productid 添加索引会有所帮助,因为您正在根据 productid 查找行。就您而言,问题是添加数量索引是否会有所帮助
        猜你喜欢
        • 2023-03-27
        • 2016-09-02
        • 2019-10-04
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 2020-10-30
        • 2021-06-28
        相关资源
        最近更新 更多