在 MySQL 的 InnoDB 引擎 和MyISAM引擎中,每个索引都会对应一颗 B+ 树,而聚簇索引和非聚簇索引最大的区别在于叶子节点存储的数据不同,聚簇索引叶子节点存储的是行数据,因此通过聚簇索引可以直接(注意是直接)找到真正的行数据
举个栗子:
某地区发生了一起案件,警察在现场找到10个身份证,要逐个问话。
如果警察将这10个人拿着各自的身份证全都叫到警局来等待问话,那就是聚簇索引(把人聚在一起)。
如果警察先是把这10个人的身份证都收了过来(保证他们跑不了),然后让他们在家等着,每次按照身份证来传唤每个人。这时候注意,对于身份证来说就是聚簇索引(身份证都聚集在一起),对于人来说就是非聚簇索引(人还是分散的)。
将上例中的身份证理解为主键,嫌疑人理解为一个数据节点。然后继续往下看
InnoDB引擎既包含聚簇索引也包含非聚簇索引,而MyISAM引擎只有非聚簇索引
看图:

图中:
聚簇索引:将存储数据与索引放在一起,找到了索引也就找到了数据 (嫌疑人拿着身份证在警局等待问询)
非聚簇索引:将数据存储与索引分开,索引的叶子节点指向(注意不是存储)数据的对应行,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据 (警察先找身份证,找到身份证后,再去传唤嫌疑人)
主键索引:根据表主键创建的索引是主键索引。
InnoDB中,主键索引是聚簇索引,叶子节点直接存储了表数据。
MyISAM中,主键索引是非聚簇索引,叶子节点指向了数据对应的行。
二级索引:
除去主键外,自己创建的索引被称为二级索引(可以理解为,警察除了身份证还有嫌疑人的地址,可以根据地址找人),在InnoDB中二级索引的叶子节点存储的不是数据,而是主键索引的值,通过二级索引查数据时,先查到主键的值,然后再去主键索引中去找数据(警察根据地址找人时,先根据地址找到身份证,再根据身份证找人)
二级索引在InnoDB中可以理解为是非聚簇索引(满足非聚簇索引的定义:叶子节点不存储数据)。
二级索引在MyISAM中是非聚簇索引(MyISAM中没有聚簇索引)。