Skip to content

Latest commit

 

History

History
36 lines (21 loc) · 2.39 KB

MySQL索引-聚簇索引.md

File metadata and controls

36 lines (21 loc) · 2.39 KB

聚簇索引(又名聚集索引)

概念:什么是聚簇索引?

聚簇索引,并不是一个单独的索引类型,而是一种数据结构

实际上就是 数据按照某一列进行排列(所以一个表只能有一个聚簇索引

例如:在InnoDB的聚簇索引实际上是在同一结构中保存了B+Tree索引和数据行

MyISAM不支持聚簇索引

​ 补充:InnoDB一般通过主键聚集数据,假如没有定义主键,也会选择一个唯一的非空索引代替

​ 节点页只记录索引列,叶子页包含了行的全部数据

聚簇索引的优缺点:

优点

  • 可以把相关的数据都关联起来 例如根据用户ID来聚集数据,只需要在磁盘中读取少部分的页便可以获得该用户的所有数据
  • 数据访问更快 聚簇索引将索引和数据保存在了同一个B+Tree上,从而聚簇索引获取数据比非聚簇索引查找更快、
  • 使用覆盖索引扫描的查询可以直接使用页节点中的主键值 (覆盖索引扫描还没看)

缺点:(为什么InnoDB推荐使用主键作为索引而且是自增主键而不是UUID做为主键)

  • 聚簇索引是为了提高I/O密集应用的效率,倘如数据能够全都放进内存中的话,聚簇索引便没什么用了
  • 插入速度严重依赖插入顺序 在InnoDB中,按主键的顺序插入是效率最快的。加入不是按照主键顺序加载数据的话,在加载完成后最好使用 OPTIMIZE TABLE 命令重新组织下表
  • 更新聚簇索引列的代价很高 因为会强制InnoDB将每个被更新的行移动到新的位置
  • 基于聚簇索引的表插入新行或者主键被更新导致需要移动行的时候,可能会导致页分裂 例如:往一个已满的页中再插入一条数据,需要分裂出新的一页来放这些数据,浪费磁盘空间
  • 聚簇索引会导致全表扫描变慢 特别是行比较稀疏,或者由于页分裂导致数据存储不连续的时候
  • 二级索引(非聚簇索引)可能会比想象中大 因为二级索引的叶子节点包含了引用行的主键列???
  • 二级索引需要二次查找 存储引擎首先需要在二级索引的叶子节点找到对应的主键值,然后在通过主键值去聚簇索引中找到对应的行 在InnoDB中,自适应哈希索引能够减少这样的重复工作