索引和列

时间:2009-01-13 03:56:14

标签: mysql sql sql-server indexing sum

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

5 个答案:

答案 0 :(得分:41)

抱歉,目前尚不清楚你在问什么。

您是否在问,是否可以加快查询,例如

SELECT product, sum(quantity) FROM receipts 
GROUP BY product

如果您在数量上添加了索引?

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

有一个模糊的异常(很少适用,大多数数据库优化器可能都不会执行这个技巧)。如果您的查询恰好是

SELECT sum(foo) FROM bar

,foo上有一个索引,bar是一个包含很多列的表,可以读入完整的索引,比你读取基础表时产生更小的命中,并直接从index - 永远不必触摸“真实”表格!但是,这是一种非常罕见的情况,您需要测试优化器是否知道在依赖此操作之前执行此操作。

答案 1 :(得分:9)

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

答案 2 :(得分:5)

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

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

你的问题的答案取决于斯宾塞的答案:

“聚合函数(count,max,min,sum,avg)必须遍历要求总和的列中的所有条目。”

刚刚澄清了Spencer答案中的专栏背景。尽管如此,他的回答是正确的。

答案 3 :(得分:0)

如果索引覆盖,通常会更快。表格中的列数与索引中的数字之间的差异将确定多快。此外,如果有任何过滤标准,它可能会更快。

答案 4 :(得分:0)

我在使用此查询时发现在where(productid here)帮助中索引列:

SELECT productid,sum(quantity)FROM receipts WHERE productid = 1 GROUP BY productid

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