1. 基础
定义:
通过非主键索引进行查询时,select的字段不能通过非主键索引获取到,需要通过非主键索引找到主键;从聚
簇索引再次查询一遍(需要多扫描一棵主索引树),获取到所要查询的记录;回表指的就是这个过程。
InnoDB主索引示意图(来源于网络):
InnoDB引擎侠表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶子结点的data域保存了完整的
数据记录。索引的key是数据表的主键,这样看来InnoDB数据表本身就是主索引。
InnoDB辅助索引示意图(来源于网络):
InnoDB辅助索引的data域存储相应记录主键的值,不同于MyISAM的data域存储的是地址。
1.1 概念拓展
聚集索引(聚簇索引):
*聚集索引的非叶子节点存储表的主键;
*聚集索引的叶子节点存储当前表中每条记录的所有信息;
*按主键搜索十分高效。
非聚集索引(非聚簇索引):
*非聚集索引的非叶子节点存储的是自己设置的索引对应的字段的值(如果是联合索引就存储联合索引对应的几
个字段的值);
*非聚集索引的叶子节点只存储当前记录对应的主键id;
*在非索引覆盖的情况下,需要检索两边索引(先通过辅助索引获得主键,然后用主键到主索引检索获得数据)
总结:
*聚集索引是将主键ID指向了整条数据记录;
*非聚集索引是将创建索引的字段指向主键ID。
2. 实例验证
2.1 通过Explain的Extra判断是否回表
useing index:一定没有回表
null:多数情况下需要回表
useing where:多数情况下需要回表