都是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占优势些,因为索引所占空间⼩,这些操作是需要在内存中完成的。