创建覆盖索引的原因是,在查询的where子句中输出或引用所需的所有列都存在于索引数据结构"内部"(作为索引键的一部分或作为一个包含的列).
这反过来意味着数据库引擎不需要检索任何其他数据库数据页以满足查询的需要.简而言之,这意味着在绝大多数情况下查询会更快.
SQL Server优化提供了一个很好的参考,它提供了SQL Server中覆盖索引示例的解释.
以下是关于MySQL的一个很好的讨论:如何利用MySQL索引优化
现在在考虑缺点时,这是一个有趣的问题,假设我们有一个非常宽的表,并且为了为您的查询创建覆盖索引,您必须合并20个大数据类型列,您的索引可能很快变得非常大.然后,您需要权衡与索引维护和表插入/更新成本相关的性能增益.它将是其中之一,它取决于(取决于工作负载模式,使用的数据等)情况.