聚簇索引与非聚簇索引

聚簇索引介绍:

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于实现方式,例InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。

当表有聚簇索引时,他的数据行实际放在索引的叶子页(leaf page),术语“聚簇”。

聚簇索引实现:

存储引擎负责实现索引,因此不是所有的存储引擎都支持聚簇索引。

  • InnoDB,B+Tree
    • 按顺序存储数据,可以用来做Order B和Group By从操作。帮助数据库服务器避免排序和临时表。
    • 将B+tree索引和数据行都存储在同一结构;索引中存储了实际的列值,某些查询只用索引便能够完成全部查询。大大减少了服务器需要扫描的数据量。
    • 将随机I/O变更为顺序I/O。

聚簇索引列选取规则:

一些数据库服务器允许选择哪个索引作为聚簇索引,mysql5.6及之前内建的存储引擎未能支持这一点。InnoDB将通过主键聚集数据。若没有定义主键列,InnoDB会选择一个唯一的非空索引来作为聚簇索引。如果两个索引列都不存在。InnoDB会隐式定义一个主键来作为聚簇索引。

非聚簇索引:

索引和数据行内容分开存储。索引关联到指针,指针关联到具体数据行,一次查找。

什么是页分裂:

当行的主键值必须将这一行插入到某个已满的页中,存储引擎会将该页分成两个页面来容纳改行,这就是一次页分裂操作。页分裂会导致表占用更多磁盘空间。

InnoDB是页的方式存储吗?

是的

InnoDB聚簇索引存储结构:

  • 树结构聚簇索引与非聚簇索引_第1张图片

     

 

  • 数据页按聚簇索引列按顺序存储:聚簇索引+数据行聚簇索引与非聚簇索引_第2张图片

 

聚簇和非聚簇表对比图:

InnoDB二级索引查找出主键列值后,再根据主键列值在主键索引二次查找。

注:聚簇索引最后一个叶子节点,包含key值和数据行。

聚簇索引与非聚簇索引_第3张图片


参考书籍:《高性能MyQL 第三版》

 

你可能感兴趣的:(聚簇索引与非聚簇索引)