sql - 索引可以用于聚合计算吗?
问题描述
索引可用于执行以下操作:
SELECT name FROM bigtable GROUP BY name
也就是说,它可以遍历 btree 或任何索引结构来获取值。但是,索引对这样的事情有帮助吗?
SELECT name, count(1) FROM bigtable GROUP BY name
请注意,出于此问题的目的,不会应用过滤器或排序。
我的想法是它不会因为需要表扫描(无论是否有索引)来“总结”所有值。这是正确的,还是我在这里遗漏了什么?索引对聚合计算有用吗?如何或如何不?
除了预先存储这些值之外,还有什么方法可以加快这些值的计算速度,或者这实际上只是磁盘速度的问题。
解决方案
我的想法是它不会因为需要表扫描(无论是否有索引)来“总结”所有值。
不,您也可以只扫描索引。它包含(在您的示例中)每行及其name
列值的条目。
与表格不同的是,索引已经按 分组/排序name
,因此不需要额外的排序步骤。如果您尝试使用全表扫描来执行此操作,则需要大量内存或临时空间来运行每个名称的计数器。
第二部分在这里有很大的不同(扫描整个索引比扫描整个表更快,这当然也是如此,因为它更小并且可能已经缓存)。
您应该能够通过查看执行计划轻松地验证这一点。
请注意,出于此问题的目的,不会应用过滤器或排序。
如果您确实引用了查询中的其他列,则索引不再是“覆盖索引”并且不能再(单独)用于满足查询。
推荐阅读
- r - 右 | 根据其他数据框中的条件更新数据框中的列
- mongoose - 在 Mongoose 中连接文档,其中一个文档具有不同的模式
- .net - 表单提交剃须刀页面上的 400 错误(但仅在 2 分钟后)
- javascript - 两个脚本拒绝一起运行
- sml - 有没有办法在 if - else 语句中将两个动作作为 then 的结果?
- c - 不兼容的指针类型 Eclipse 函数
- c# - 这个符号在c#中是什么意思(^=)
- sql - 有没有办法在 SQL 中加入两个查询,每个查询都有一个 order by?
- python - 使用 PuLP 和 Gurobi 作为求解器时如何禁用生成 gurobi.log 文件?
- ethereum - 如何从松露控制台读取结构中的字段?