MySQL 8.0执行SELECT id查询时为何使用主键之外的其他索引
底层原因如下:
InnoDB 索引结构差异
InnoDB的主键索引是聚簇索引,叶子节点存储完整的行记录,单个数据页可容纳的记录数量有限。而你创建的二级唯一索引idx_number的B+树叶子节点仅存储索引列number和主键值id,没有其他冗余字段,单个数据页能存储的记录数远多于聚簇索引。覆盖索引命中
你的查询语句SELECT id FROM test仅需要返回主键id的值,idx_number的叶子节点已经包含了查询需要的全部字段,不需要回表查询聚簇索引获取额外数据,完全可以满足查询需求,属于覆盖索引场景。优化器成本选择逻辑
MySQL优化器会自动计算不同执行路径的IO成本:全量扫描二级索引需要读取的数据页数量更少,整体IO成本远低于扫描聚簇索引,因此优化器会优先选择成本更低的二级索引执行查询。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

