【发布时间】:2010-10-01 01:49:34
【问题描述】:
为正在求和的列创建索引是否比没有索引快?
【问题讨论】:
标签: mysql sql sql-server indexing sum
为正在求和的列创建索引是否比没有索引快?
【问题讨论】:
标签: mysql sql sql-server indexing sum
抱歉,不清楚您在问什么。
您是在问,它会加快诸如
之类的查询吗SELECT product, sum(quantity) FROM receipts
GROUP BY product
如果您添加了数量索引?
如果这是问题,那么答案是否定的。一般来说,当您需要在众多行中查找几行时,索引会很有帮助;在这里你需要所有行,所以索引没有帮助。
有一个晦涩的异常(很少适用,大多数数据库优化器可能不会费心实现这个技巧)。如果您的查询恰好是
SELECT sum(foo) FROM bar
,在 foo 上有一个索引,bar 是一个有很多列的表,可以读取完整索引,比读取基础表产生的命中要小,直接从index - 根本不必触摸“真实”表!然而,这是一种相当罕见的情况,您需要测试一下您的优化器是否知道这样做,然后再过分依赖它。
【讨论】:
没有。索引通过限制需要多少检查来改进搜索。无论如何,聚合函数(count、max、min、sum、avg)必须遍历列中的所有条目。
【讨论】:
如果你想让求和更快,你可以预先实现结果。在 Oracle 上使用Materialized Views,在 MS SQL 上使用Indexed Views。
关于您的具体问题“为正在求和的列创建索引是否比没有索引更快?”,答案是否定的。
您的问题的答案取决于 Spencer 的回答:
“无论如何,一个聚合函数(count、max、min、sum、avg)必须遍历列中的所有条目进行求和。”
刚刚澄清了斯宾塞回答中列的上下文。不过他的回答是正确的。
【讨论】:
如果索引覆盖,通常会更快。快多少取决于表中列数与索引中列数之间的差异。此外,如果有任何过滤条件,它可能会更快。
【讨论】:
我发现在 where(productid here) 中对列进行索引有助于使用此查询:
从收据中选择 productid, sum(quantity) WHERE productid = 1 GROUP BY productid
添加索引后,我的一个查询从 45 秒变为几乎即时。
【讨论】: