MySQL索引聚合索引介绍
在MySQL的InnoDB引擎表是(集群)索引组织表(聚集索引组织表),而MyISAM引擎的表是堆组织表(堆组织表)。
聚合索引也称为聚类索引。
当然,聚合索引的概念并不是MySQL独有的,其他数据库系统也有。
总之,聚集索引是组织形式的关键索引,逻辑顺序索引决定了表行的物理存储顺序,而非聚集索引是索引,只需在一列数据上创建相应的索引,不影响整个表序列的物理存储。
让我们来看一下这两种存储方式的区别:
简单地说,物联网数据的物理存储顺序与主键索引是一致的,因此,如果新数据是离散的,那么数据块将是离散的而不是连续的,热表数据写入的顺序按写入时间顺序存储。
物联网表对热表的优点是:
范围查询效率较高;
当数据频繁更新(聚合索引本身未更新)时,生成片段并不容易。
它特别适合于一小部分热数据频繁地读写。
通过主键快速访问数据。
物联网表的缺点是:
如果数据变化是离散的,那么效率将比热表更差。
热表的缺点是:
索引表的阅读成本很高。
大多数数据是随机读取的,不能保证按顺序读取。
每个InnoDB表只能创建一个聚集索引,可以由一个或多个列。
如上所述,InnoDB是一个聚集索引组织表和聚集指数选择的规则是这样的:
首先,选择显式定义的主索引作为聚集索引。
如果没有,则选择不允许null的第一个索引;
如果不是,InnoDB引擎内置的rowid作为聚集索引。
让我们看看InnoDB的主键索引图一看:
图片来自高性能MySQL。
可以看出,此索引结构的叶节点,该节点的关键值是主键的值,而该节点的值存储剩余的列数据和附加信息如rowid,回滚指针,TRX ID等等。
在这个图,结合上文,我们可以知道,在InnoDB表的聚集索引,相当于整个表,和整个表也是一个聚集索引,主键约束是聚集指数和聚集指数不一定是主键。
MyISAM是一堆组织表,它没有聚集索引的概念。