聚簇索引与非聚簇索引(二级索引)的区别

聚簇索引:将数据存储与索引放在一块,找到索引也就找到了数据。

非聚簇索引:将数据存储与索引分开,索引结构的叶子节点指向数据的对应行。myisam通过key_buffer把索引先缓存在内存中,访问数据时,在内存中直接搜索索引,然后通过索引找到磁盘对应数据。

注意:innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据需要二次查找,非聚簇索引都是辅助索引。辅助索引叶子节点存储的不再是物理位置,而是主键值。

聚簇索引具有唯一性:由于聚簇索引是将数据跟索引放在一起,因此一个表仅有一个聚簇索引。聚簇索引默认是主键,如果表中没有定义主键,innodb会选择一个唯一的为空索引代替,如果没有这样的索引,innodb会隐式定义一个主键来作为聚簇索引。

聚簇索引的优缺点

  • 行数据跟叶子节点存储在一起,同一页有多行数据,访问同一数据页不同行记录时,已经把页加载到了buffer中(主键和行数据一起被载入内存),再次访问的时候,只在内存中即完成访问,不必访问磁盘。获得数据更快。
  • 减少了当出现行移动或者数据页分裂时辅助索引的维护工作。使用主键值作为指针会让辅助索引占更多空间,但是innodb在移动行时无需更新辅助索引中的这个指针。当行位置随着数据库里数据的修改而发生变化,使用聚簇索引可以保证辅助索引树不受影响。
  • 维护索引昂贵。
  • 使用随机id作为主键,数据存储稀疏,可能导致聚簇索引比全表扫描更慢。
  • 如果主键比较大,辅助索引将会更大。
posted @ 2020-04-01 13:34  smallzhen  阅读(806)  评论(0编辑  收藏  举报