之前一直以为索引优化在where中有效
在select中无用
但是貌似 select非聚集索引列,聚集索引列,无索引列以及select *之间是有性能区别的?
之前一直以为索引优化在where中有效
在select中无用
但是貌似 select非聚集索引列,聚集索引列,无索引列以及select *之间是有性能区别的?
3 回答1.7k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
3 回答1.6k 阅读
2 回答980 阅读✓ 已解决
以MySQL的InnoDB存储引擎为例,有如下解释:
每个索引上包含的字段会有不同,聚集索引包含所有字段,非聚集索引只包含索引字段+主键字段,所以如果在使用非聚集索引后还需要使用其他字段的(包括在where条件中或者select子句中),则需要通过主键索引回表到聚集索引获取其他字段。如果是非聚集索引可以满足SQL语句的所有字段的,则被称为全覆盖索引,没有回表开销。
回表是一个通过主键字段重新查询聚集索引的过程,所以如果在大量记录需要回表的情况下,查询成本会比直接在聚集索引上范围扫描的成本还大。所以对于一些情况,不使用非聚集索引效率反而更高。
为什么要限定是InnoDB存储引擎呢?因为MyISAM存储引擎数据文件和索引文件是分离的,不存在聚集索引的概念。
具体详情和原理可参考我最近发布的文章:数据库索引融会贯通