目录
例如: user表有 id name age address work 五个字段
id 是主键
name 是普通索引
age address 是组合索引
work 没有加任何索引
小知识: 表中的每个索引都会维护一个B+树, 只有主键索引树数据才是完整的(聚集索引)
主键索引树
name列 - 普通索引树
age address - 组合索引树
索引 - 涉及的三个重要概念
聚集索引(也叫主键索引)
聚集索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的记录数据。
非叶子节点 : 存放主键id、索引
叶子节点 : 存放行记录数据
回表
select * from user where name = 王亮
执行这个sql, 需要查询2课B+树, 首先根据name查询(name列的B+树)得到对应的主键id, 然后根据主键id查询(主键B+树)对应的行数据, - 这个过程称之为回表
覆盖索引
select id, name from user where name = 张三
执行这个sql, 首先查询name索引的B+树, 但是这个sql只返回id和name, 在第一棵树里边就可以拿到我们需要的所有数据, 这个时候就不需要再回表了,
这种情况就是覆盖索引, 正确情况下, 是推荐使用覆盖索引的, 可以减少回表次数.
select id, age,address from user where age = ? -- 覆盖索引 - 走的age address组合索引树
select id, name, age from user where name = ? -- 覆盖索引 - 走的name普通索引数
select work from user where name = ? -- 回表 - 1.name普通索引树 2.主键索引树