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

索引可以用于聚合计算吗?

  •  0
  • David542  · 技术社区  · 5 年前

    索引可用于执行以下操作:

    SELECT name FROM bigtable GROUP BY name
    

    也就是说,它可以遍历btree或任何索引结构来获取值。然而,索引对这样的事情有帮助吗?

    SELECT name, count(1) FROM bigtable GROUP BY name
    

    请注意,对于此问题,不会应用筛选器或排序。

    我的想法是不会,因为需要一个表扫描(不管是否有索引)来“总结”所有的值。这是对的,还是我遗漏了什么?索引对聚合计算有用吗?怎么做还是怎么不做?

    除了预先存储这些值之外,还有什么方法可以加快这些值的计算速度,或者这实际上只是磁盘速度的问题。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Thilo    5 年前

    我的想法是不会,因为需要一个表扫描(不管是否有索引)来“总结”所有的值。

    不,你也可以扫描索引。它包含(在您的示例中)每一行的一个条目及其 name 列值。

    与表不同,索引已经按 名称 ,因此不需要额外的排序步骤。如果尝试使用全表扫描来执行此操作,则需要大量内存或临时空间来运行每个名称的计数器。

    第二部分是这里的主要区别(并不是说扫描整个索引要比扫描整个表快,这当然也是正确的,因为它更小,而且可能已经缓存了)。

    您应该能够通过查看执行计划轻松验证这一点。

    请注意,对于此问题,不会应用筛选器或排序。

    如果您确实引用了查询中的其他列,则索引不再是“覆盖索引”,也不再(单独)用于满足查询。