4. 聚簇索引(一级)与非聚簇索引(二级)

1. 什么叫聚蔟

聚簇指将索引和数据放在一起, 因此:

  • 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
  • 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行(innodb中叶子节点给出聚簇索引的值)

2. 聚簇索引与主键

主键在 mysql 中是很重要的.

  • 聚簇索引默认是主键
  • 如果表中没有定义主键, 会选择表中唯一的非空索引代替.
  • 如果没有这样的索引, InnoDB 会隐式定义一个主键来作为聚簇索引

聚簇索引重要是因为. 其它类型的索引, 叶子节点记录的都是聚簇索引的值, 只有聚簇索引的叶子节点记录的行的物理存储位置. 因此, 使用其它索引查找记录都要经过两步:

  1. 查找该索引对应的聚簇索引值
  2. 查找该聚簇索引对应的行物理地址

每次使用辅助索引检索都要经过两次B+树查找

3. 为什么主键是自增主键

  • 为什么主键通常建议使用自增id
    聚簇索引的数据物理存放顺序与索引顺序一致.即:只要索引是相邻的,那么对应的行数据也一定是相邻的存放在磁盘上。如果主键不是自增id,那么会不断地调整数据的物理地址、分页,当然也有其他一些措施来减少这些操作,但却无法彻底避免。但如果是自增的,那就简单了,它只需一页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。
  • 为什么使用 UUID 作为主键会大幅度降低效率
    UUID 作为主键, 导致相邻的聚簇索引值生成在不同的叶子节点. 因此在调入一个节点的聚簇索引数据时, 会造成严重的缺页.

你可能感兴趣的:(4. 聚簇索引(一级)与非聚簇索引(二级))