区别:
聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续聚集索引:物理存储按照索引排序;聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序。非聚集索引:物理存储不按照索引排序;非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。优势与缺点:
聚集索引插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快。
聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,
称为非聚集索引,也叫做二级索引。
由于在
InnoDB
引擎里面,一张表的数据对应的物理文件本身就是按照
B+
树来
组织的一种索引结构,而聚集索引就是按照每张表的主键来构建一颗
B+
树,然
后叶子节点里面存储了这个表的每一行数据记录。
所以基于
InnoDB
这样的特性,聚集索引并不仅仅是一种索引类型,还代表着一
种数据的存储方式。
同时也意味着每个表里面必须要有一个主键,如果没有主键,
InnoDB
会默认选
择或者添加一个隐藏列作为主键索引来存储这个表的数据行。一般情况是建议使
用自增
id
作为主键,这样的话
id
本身具有连续性使得对应的数据也会按照顺序
跟着Mic学架构
存储在磁盘上,写入性能和检索性能都很高。否则,如果使用
uuid
这种随机
id
,
那么在频繁插入数据的时候,就会导致随机磁盘
IO
,从而导致性能较低。
需要注意的是,
InnoDB
里面只能存在一个聚集索引,原因很简单,如果存在多
个聚集索引,那么意味着这个表里面的数据存在多个副本,造成磁盘空间的浪费,
以及数据维护的困难。
由于在
InnoDB
里面,主键索引表示的是一种数据存储结构,所以如果是基于非
聚集索引来查询一条完整的记录,最终还是需要访问主键索引来检索。