注册
达梦聚集索引和非聚集索引的区别
专栏/培训园地/ 文章详情 /

达梦聚集索引和非聚集索引的区别

文橘本可 2026/09/16 93 0 0
摘要

达梦聚集索引和非聚集索引的区别,结合例子说明
一、核心区别

  1. 聚集索引(一级索引/主索引)
    • 存储方式:聚集索引按照索引键构造一棵 B+ 树,表数据直接存储在 B+ 树的叶子节点上,即聚集索引就是表数据本身,通过定位索引可直接在 B+ 树中找到整行数据。
    • 数量限制:每一个表有且只有一个聚集索引。
  • 默认行为:当建表语句未指定聚集索引键时,DM 的默认聚集索引键是 ROWID,即记录默认以 ROWID 在页面中排序。若指定了索引键,表中数据都会根据指定索引键排序。
  • 执行计划操作符:聚集索引扫描对应 CSCN2,聚集索引数据定位对应 CSEK2。
  1. 非聚集索引(二级索引/辅助索引)
    • 存储方式:将二级索引列和聚集索引列(或 ROWID 指针)共同存储在 B+ 树叶子节点上。如果查找的是非聚集索引键值或聚集索引键,可直接在 B+ 树中找到;如果查找索引键值以外的数据,则需要回到一级索引中进行查找,这个过程称为回表。
    • 数量限制:每一个表可以有多个非聚集索引。
  • 执行计划操作符:二级索引扫描对应 SSCN,二级索引数据定位对应 SSEK2,回表操作对应 BLKUP2。
    二、结合示例分析
    image.png
    1.聚集索引查找
    image.png
    2.使用非聚集索引查找(仅查索引列)
    image.png
    3.使用非聚集索引查找(需获取非索引列)
    image.png
    三、总结
    • 聚集索引:表数据直接存储在 B+树叶子节点上,定位索引后即可直接获取整行数据,效率最高;但每个表只能有一个,且不支持大字段列。
    • 非聚集索引:叶子节点仅存储索引列和聚集索引键,定位索引后若需获取其他列数据,则需要回表到聚集索引;但每个表可以创建多个,灵活性高。
    • 默认聚集索引键:当建表未指定聚集索引键时,达梦默认使用ROWID作为聚集索引键,记录默认以 ROWID 在页面中排序。若指定了索引键,表中数据都会根据指定索引键排序。
    • 主键与聚集索引:达梦通过参数PK_WITH_CLUSTER控制主键是否自动转化为聚集主键。默认情况下(值为 0),主键不会自动变为聚集主键,这是为了兼容 Oracle 等数据库的行为。
    四、注
    • 聚集索引不支持大字段列,若需将聚集主键改为非聚集索引,可通过在另一列上创建聚集索引来替代原聚集主键,然后删除新索引即可实现。
    • 如果在表上自定义了聚集索引,那么 ROWID 不再是聚集索引键,使用 ROWID 进行查询时可能走全表扫描(CSCN)。
    • 回表代价
    非聚集索引查询需要关注是否发生 BLKUP2。设计时尽量将高频查询字段建成覆盖索引,避免回表,特别是并发高、数据量大的场景。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服