在MySQL中,InnoDB引擎表是一个聚集索引组织表,而MyISAM引擎表是一个堆组织表。
在MySQL中,聚集索引和非聚集索引分别是什么意思,有什么区别?
在MySQL中,InnoDB引擎表是一个聚集索引组织表,而MyISAM引擎表是一个堆组织表。
也有人把聚集索引称为聚簇索引。
当然聚簇索引的概念不是MySQL独有的,其他数据库系统也有。
简而言之,聚集索引是一种索引组织形式。索引键值的逻辑顺序决定了表数据行的物理存储顺序,而非聚集索引是一个普通索引。它只是为数据列创建相应的索引,并不影响整个表的物理存储顺序。
让我们先来看看这两种存储形式的区别:
简单来说,IOT表中数据的物理存储顺序与主键索引的顺序是一致的,所以如果新增的数据是离散的,那么数据块就倾向于离散的,而不是顺序的。而热表数据写入的顺序按照写入时间的顺序存储。
IOT表相比HOT表的优势是:
范围查询效率更高;
当数据更新频繁时(聚集索引本身不更新),产生碎片的可能性较小;
特别适合少量热数据频繁读写的场景;
通过主键访问数据时,可以快速到达;
IOT表的缺点是:
如果数据的变化主要是离散的,效率会比热表差;
热台的缺点是:
读回索引表开销很大;
大部分数据是随机读取的,无法顺序读取,成本高。
每个InnoDB表只能创建一个聚集索引,一个聚集索引可以包含一个或多个列。
如上所述,InnoDB是一个聚集索引组织表,其聚集索引选择规则如下:
首先,选择显式定义的主键索引作为聚集索引。
如果不是,则选择不允许NULL的第一个唯一索引;
如果没有,使用InnoDB引擎内置的ROWID作为聚集索引;
我们来看看InnoDB主键索引的示意图:
图片来自高性能MySQL
可以看到,在这个索引结构的叶节点中,节点的键值是主键的值,而节点的值则存储了其他列数据,以及ROWID、回滚指针、trx id等附加信息。
结合这个图和上面可以知道,在InnoDB表中,它的聚集索引相当于整个表,整个表也是一个聚集索引。主键必须是聚集索引,但聚集索引不一定是主键。
MyISAM是堆组织表,没有聚集索引的概念。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。