最核心的区别还是从需求角度来看比较好:
1.创建索引时
在创建表时,InnoDB存储引擎会根据不同情况,选择不同的列作为索引
(1)有主键,通过主键作为聚簇索引的索引键(key)
(2)没有主键,选择一个唯一且非NULL的值作为聚簇索引的索引键(key)
(3)都没有,选择隐式自增id作为聚簇索引的索引键(key)
InnoDB采用B+树存储索引(n叉树),B+树的每个结点对应磁盘中的一个数据页(16K),每次读取时相当于一次磁盘IO,树高度决定了磁盘读取次数
聚簇索引的非叶子结点存储的是索引和子结点页号(这个很重要,不是当前结点的页号,是子结点的!相当于是指向子结点的指针),叶子结点存储完整的数据,并且是按顺序存储的,叶子结点之间构成双向链表(适合范围查找)
非聚簇索引非叶子结点和聚簇索引一致,区别是非叶子结点存储的是主键值(注意是主键值)
总结:索引的创建为了快速查找到对应的数据,而主键可以唯一对应上某个数据行,所以在创建时可以节约空间,不用给每个列创建的索引都包含完整数据
todo1:什么时候会让存储引擎创建聚簇索引,什么时候创建非聚簇索引?
todo2: 聚簇索引叶子结点顺序存储是按什么顺序
2.通过索引查找数据时
通过非聚簇索引查找时,可以得到主键
如果需要的数据已找到——覆盖索引
没找到,通过主键到聚簇索引中找——回表