聚簇索引和非聚簇索引
聚簇索引和非聚簇索引1. 聚簇索引数据行和索引存储在一起索引的叶子节点包含完整的行数据。特点一个表只能有一个聚簇索引InnoDB 中聚簇索引就是主键索引如果没有显示主键InnoDB 会选择第一个非空唯一索引如果没有则隐式生成一个 6 字节的row_id聚簇索引结构示意 [10] / \ [5] [15] / \ / \ [3] [7] [12] [20] 数据行 数据行 数据行 数据行 ← 叶子节点直接存完整数据2. 非聚簇索引索引和数据分开存储叶子节点只存索引列和主键值。特点一个表可以有多个非聚簇索引普通索引、唯一索引非主键、联合索引都属于非聚簇索引非聚簇索引结构示意 [name: Bob] / \ [name: Alice] [name: Charlie] / \ / \ 主键:3 主键:7 主键:12 主键:15 ← 叶子节点存的是主键值3. 通过非聚簇索引查询的过程回表用户查询SELECT * FROM user WHERE name Alice; Step 1: 在非聚簇索引上找到 nameAlice 的叶子节点 → 拿到主键值比如 id3 Step 2: 用 id3 去聚簇索引中查找完整行数据 → 这就是回表Lookup/回表查询 Step 3: 返回完整数据回表的成本需要两次索引查找非聚簇索引 聚簇索引IO开销更大。4. 覆盖索引如果查询的列全部在非聚簇索引中就不需要回表-- 假设有索引 idx_name_age(name, age) SELECT name, age FROM user WHERE name Alice; -- 只需要查非聚簇索引不需要回表这就是覆盖索引