都是B+树的数据结构
聚簇索引: 将数据存储与索引放到了⼀块、并且是按照⼀定的顺序组织的,找到索引也就找到了数 据,数据的 物理存放顺序与索引顺序是⼀致的 ,即:只要索引是相邻的,那么对应的数据⼀定也是 相邻地存放在磁盘上的 ⾮聚簇索引: 叶⼦节点不存储数据、存储的是 数据⾏地址 ,也就是说根据索引查找到数据⾏的位置 再取磁盘查找数据,这个就有点类似⼀本树的⽬录,⽐如我们要找第三章第⼀节,那我们先在这个 ⽬录⾥⾯找,找到对应的⻚码后再去对应的⻚码看⽂章。 优势: 1 、查询通过聚簇索引可以直接获取数据,相⽐⾮聚簇索引需要第⼆次查询(⾮覆盖索引的情况 下)效率要⾼ 2 、聚簇索引对于范围查询的效率很⾼,因为其数据是按照 ⼤⼩排列 的 3 、聚簇索引适合⽤在 排序 的场合,⾮聚簇索引不适合 劣势: 1 、维护索引很昂贵,特别是 插⼊新⾏ 或者 主键被更新导⾄要分⻚ (page split)的时候。建议在⼤量插⼊新⾏后,选在负载较低的时间段,通过OPTIMIZE TABLE优化表,因为必须被移动的⾏数据可能造成碎⽚。使⽤独享表空间可以弱化碎⽚ 2 、表因为使⽤UUId(随机ID)作为主键,使 数据存储稀疏 ,这就会出现聚簇索引有可能有⽐全表扫⾯更慢,所以建议使⽤int的auto_increment作为主键 3 、如果主键⽐较⼤的话,那辅助索引将会变的更⼤,因为辅助索引的叶⼦存储的是主键值;过⻓的主键值,会导致⾮叶⼦节点占⽤占⽤更多的物理空间 InnoDB InnoDB中⼀定有主键,主键⼀定是 聚簇索引 ,不⼿动设置、则会使⽤ unique 索引,没有unique索引,则会使⽤数据库内部的⼀个⾏的隐藏id来当作主键索引。在聚簇索引之上创建的索引称之为辅助索引, 辅助索引访问数据总是需要 ⼆次查找 ,⾮聚簇索引都是辅助索引,像 复合索引 、 前缀索引 、 唯⼀索引 ,辅助索引叶⼦节点存储的不再是⾏的物理位置,⽽是主键值 MyISM: MyISM使⽤的是⾮聚簇索引,没有聚簇索引,⾮聚簇索引的两棵B+树看上去没什么不同,节点的结构完全⼀致只是存储的内容不同⽽已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独⽴的地⽅,这两颗B+树的叶⼦节点都使⽤⼀个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于 索引树是独⽴的 ,通过辅助键检索⽆需访问主键的索引树。 优势: 如果涉及到 ⼤数据量的排序 、 全表扫描 、 count 之类的操作的话,还是MyISAM占优势些,因为索引所占空间⼩,这些操作是需要在内存中完成的。



