1. 什么叫聚集索引与普通索引
聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引
普通索引的叶子节点存储主键值。
假设有下表table
table (id PK, name KEY, sex, flag);
表中有四条记录:
1, shenjian, m, A
3, zhangsan, m, A
5, lisi, m, A
9, wangwu, f, B
则该表的聚集索引和普通索引的B+树的数据结构如下图所示。
如上图左右聚集索引,右为普通索引。从普通索引是无法直接定位到行记录的,只能查询到主键的值。
2. 既然普通索引不能直接插到行的记录,那普通索引的查询过程是怎么样的呢?
如粉红色路径,即为普通索引的查询过程,需要扫码两遍索引树:
(1)先通过普通索引定位到主键值id=5;
(2)在通过聚集索引定位到行记录;
这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。
3.什么是索引覆盖 (Covering index) ?
只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。