都是B+树的数据结构

  • 聚簇索引:将数据存储和索引放到一起,都是按照一定的顺序组织,找到索引也找到了数据,数据的物理存储和索引顺序是一致的,即:只要索引相连,那么对应的数据一定也是相邻存储在磁盘上的
  • 非聚簇索引:叶子节点不存储数据,存储的是数据行地址,也就是说根据索引查找到数据行的位置再去磁盘查找数据,这个有点类似一本书的目录。
优势:
1、根据聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询效率要高
2、聚簇索引对于范围查询效率更高,因为其数据是按大小排列的
3、聚簇索引适合用在排序的场合,非聚簇索引不适合

劣势:
1、维护索引很昂贵,特别是插入新行或者主键被更新导致要分页的时候。建议在大量插入新行后,选在负载较低的时间段,通过OPTIMIZE TABLE优化表,因为必须被移动的行数据可能造成碎片。使用独享表空间可以弱化碎片。
2、表因为使用UUID(随机ID)作为主键,使用数据存储稀疏,这就会出现聚簇索引可能比全表扫描更慢,所以建议使用int的auto_increment作为主键。
3、如果主键比较大的时候,其辅助索引将会变得更大,因为辅助索引的叶子存储的是主键值,过长的主键值,会导致非叶子节点占用更多的物理内存

InnoDB中一定有主键,主键一定是聚簇索引。不手动设置,则会使用unique索引,没有unique索引,则会使用数据库内部一个行的隐藏id来当做主键索引。在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查询。非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值

聚簇索引的每一个叶子节点都包含了主键值、事务ID、用于事务和MVCC的回滚指针以及所有的剩余列

MyISAM使用的是非聚簇索引,没有聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致,只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两棵B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键索引无需访问主键的索引树。

如果涉及到大量数据量的排序、全表扫描、count之类的操作的话,还是MyISAM占优势些,因为索引所占空间小,这些操作是需要在内存中完成的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐