Mysql: select非聚集索引列,聚集索引列,无索引列以及*,性能如何比较?

之前一直以为索引优化在where中有效
在select中无用
但是貌似 select非聚集索引列,聚集索引列,无索引列以及select *之间是有性能区别的?

阅读 2.5k
1 个回答

以MySQL的InnoDB存储引擎为例,有如下解释:

每个索引上包含的字段会有不同,聚集索引包含所有字段,非聚集索引只包含索引字段+主键字段,所以如果在使用非聚集索引后还需要使用其他字段的(包括在where条件中或者select子句中),则需要通过主键索引回表到聚集索引获取其他字段。如果是非聚集索引可以满足SQL语句的所有字段的,则被称为全覆盖索引,没有回表开销。

回表是一个通过主键字段重新查询聚集索引的过程,所以如果在大量记录需要回表的情况下,查询成本会比直接在聚集索引上范围扫描的成本还大。所以对于一些情况,不使用非聚集索引效率反而更高。

为什么要限定是InnoDB存储引擎呢?因为MyISAM存储引擎数据文件和索引文件是分离的,不存在聚集索引的概念。

具体详情和原理可参考我最近发布的文章:数据库索引融会贯通

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏