>关于聚簇索引和非聚簇索引的内容。
聚簇索引不是一种单独的索引类型,而是一种数据存储方式。将数据存储与索引放到了一块,找到索引也就找到了数据。
非聚簇索引也叫二级索引,将数据存储与索引分开结构,索引结构的叶子节点指向了数据的对应行地址,通过地址才能找到对应的数据。
>InnoDB 中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像组合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值。
当表有聚簇索引时,它的数据行实际存放在索引的叶子节点中。
**聚簇索引默认是主键,如果没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式的定义一个主键来作为聚簇索引。InnoDB 只聚集在同一个页面的记录。**
聚簇索引的优缺点,
优点:
1. 可以把数据保存到一起。较少磁盘 I/O 的次数;
2. 数据访问更快。数据和索引保存在同一个节点上,获取速度比非聚簇索引要快;
3. 使用覆盖索引扫描的查询可以直接使用页节点的主键值。
缺点:
1. 如果数据全部放在内存中,聚簇索引的优势就不明显了;
2. 插入速度严重依赖于插入顺序。按照主键的顺序插入就加载数据到 InnoDB 表中最快的方式;如果不上按照主键顺序插入,加载完成后最好使用 OPTIMIZE TABLE 命令重新组织一下表;
3. 更新聚簇索引的代价很高;
4. 基于聚簇索引插入新行,或者主键被更新导致需要移动行的时候,可能面临“页分裂”的问题;
5. 聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于行分裂导致数据存储不连续的情况;
6. 二级索引可能比想象更大,因为在二级索引的叶子节点包含了引用行的主键列;
7. 二级索引访问需要两次索引查找,而不是一次;
聚簇索引的每个叶子节点都包含了主键值、事务 ID、用于事务和 MVCC 的回滚指针以及所有的剩余列。如果主键是一个列前缀索引,InnoDB 也会包含完整的主键列和剩下的其他列。
使用 InnoDB 时应该尽可能地按照主键顺序插入数据,并且尽可能地使用单调增加的聚簇键的值来插入新行。

聚簇索引和非聚簇索引