答案 0 :(得分:5)
创建覆盖索引背后的原因是,在查询的where子句中输出或引用所需的所有列都存在于索引数据结构的“内部”(作为索引键或included列)。
这反过来意味着数据库引擎不需要检索任何其他数据库数据页面以满足查询的需要。简而言之,这意味着在绝大多数案例中,查询会更快。
有一个很好的参考资料SQL Server Optimization,它提供了SQL Server中覆盖索引示例的解释。
这是关于MySQL的一个很好的讨论:How to exploit MySQL index optimizations
现在在考虑缺点时,这是一个有趣的问题,假设我们有一个非常宽的表,并且为了为您的查询创建覆盖索引,您必须合并20个大数据类型列,您的索引很快就会变得非常大。然后,您需要权衡与索引维护和表插入/更新成本相关的性能增益。它将是其中之一,它取决于(取决于工作负载模式,使用的数据等)案例。
答案 1 :(得分:2)
除了约翰斯回答:
优势:如果可以从覆盖的字段中回答查询,则访问速度更快,因为不需要访问该行。
缺点:更新速度较慢,因为需要更新索引中的更多数据。