聚集索引和非聚集索引

拥有回忆 提交于 2019-12-22 07:17:07

聚集索引和非聚集索引

  • 聚集索引: 按照每张表的主键构造B+树,非叶子节点用来存放索引,叶子节点(数据页)用来存放整张表的行记录数据,按照主键的顺序排序,每个数据页都通过一个双向链表来连接,因此,聚集索引能够在B+树索引的叶子节点上直接找到数据,而且对主键的排序查找和范围查找速度非常快。(聚集索引的存储不是物理上连续的,而是逻辑上连续的,这样可以降低维护成本。每张表只能有一个聚集索引,因为数据页只能按照一棵B+树来排序)
  • 非聚集索引(辅助索引): 叶子节点存放的是键值对,还包含一个指针,指向聚集索引的主键。当通过非聚集索引来查找数据时,首先遍历非聚集索引,找到对应的叶子节点,并获得对应聚集索引的主键,然后通过这个聚集索引找到对应的行,所以它需要两次索引查找。

聚集索引优点:

  • 可以把相关数据存放在一起。比如实现电子邮箱获取用户邮件时,如果不使用聚集索引,则每封邮件都可能产生一次磁盘IO,如果采用聚集索引,根据用户ID来聚集数据,那么只需要从磁盘读取少量的数据页就可以获得某个用户全部的邮件了。
  • 数据访问更快。因为聚集索引将索引和数据保存在同一个B+树中,查找效率高。

聚集索引缺点:

  • 更新聚集索引列的代价很高,因为会强制InnoDB将每个被更新的行移动到新的位置。
  • 插入新行时,如果要插入的页已经满了,那么存储引擎会将该页分裂成两个页面来容纳该行,所以页分裂会导致表占用更多的磁盘空间。

应用场景的区别:

  • 聚集索引适合排序,非聚集索引不适合排序的场合。因为聚集索引本身已经是按照物理顺序放置的,排序很快。而非聚集索引没有按序存放。当需要取出一定范围内的数据时,用聚集索引也比用非聚集索引好。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!