聚簇索引

来源:互联网 发布:js 显示代码 编辑:程序博客网 时间:2024/05/20 23:07

前言

索引一般是一种数据结构,而聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于存储引擎的实现方式。

InnoDB的聚簇索引

MySQL的InnoDB的聚簇索引实际上在同一个结构中保存了B-TREE索引和数据行。一些数据库服务器允许选择哪个索引作为聚簇索引,而InnoDB是通过主键聚集数据的,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键作为聚簇索引。InnoDB只聚集在同一个页面中的记录。在B-TREE索引中,节点页包含索引列,叶子页包含行的全部数据。

聚簇索引的优点

  • 可以把相关数据保存在一起。使用聚簇索引,可以减少磁盘I/O。
  • 数据访问更快,因为行数据都在索引中。因此获取数据通常更快。
  • 使用覆盖索引扫描的查询可以直接使用页节点中的主键值。

聚簇索引的缺点

  • 插入速度依赖于插入顺序。按照主键的顺序插入是加载数据到InnoDB表中速度最快的方式。
  • 更新聚簇索引列的代价很高,因为会强制InnoDB将每个被更新的行移动到新的位置。
  • 基于聚簇索引的表在做插入或者更新操作导致行移动的时候,可能面临“页分裂”的问题。
  • 聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候。
  • 二级索引访问需要两次索引查找,而不是一次。因为二级索引叶子节点保存的不是指向行的物理位置的指针,而是行的主键值,根据这个值取聚簇索引中查找到对应的行。这里做了重复工作。
原创粉丝点击