注册
达梦数据库索引:类型详解与实战应用
专栏/培训园地/ 文章详情 /

达梦数据库索引:类型详解与实战应用

小明 2026/11/05 74 0 0
摘要

目录


1. 索引的核心概念与作用

在达梦数据库(DM)中,索引是提高数据检索效率的关键数据结构。索引的本质是通过对表中指定列的值进行排序,并建立到实际数据行的快速访问路径。类似于书籍的目录,索引使得数据库系统能够快速定位目标数据而无需全表扫描。在达梦数据库中,索引与表数据物理分离,采用B+树作为主要存储结构(位图索引、全文索引等特殊类型除外),这种设计在保证高效查询的同时,也确保了数据的独立性。

2. 索引类型介绍

达梦数据库支持的索引有:聚簇索引、非聚簇索引、唯一索引、复合索引、函数索引、位图索引、全文索引、分区索引等。

2.1 聚簇索引

每个普通表有且仅有一个聚簇索引,它决定了表中数据的物理存储顺序。创建聚簇索引时,系统按索引键值重构整个表的物理存储,将数据行直接存储在B+树的叶子节点中。

适用场景:

  • 主键列(默认创建聚簇索引)
  • 经常范围查询的列

创建示例:

-- 创建表时隐含创建ID列的聚簇索引 CREATE TABLE EMPLOYEE ( ID INT PRIMARY KEY, NAME VARCHAR(50), DEPT_ID INT, HIRE_DATE DATE, GENDER SMALLINT DEFAULT 0 NOT NULL ); -- 显式创建聚簇索引(替换原有) CREATE CLUSTER INDEX idx_emp_dept ON EMPLOYEE(DEPT_ID);

2.2 非聚簇索引(二级索引)

非聚簇索引是用户最常创建的索引类型,每个表可创建多个。其叶子节点存储索引键值+聚簇索引键,当查询非索引列时需要回表查询。

适用场景:

  • WHERE子句频繁过滤的列
  • JOIN连接条件的列
  • 覆盖索引场景(仅需返回索引列)

创建示例:

-- 对EMPLOYEE表的NAME字段创建索引 CREATE INDEX idx_emp_name ON EMPLOYEE(NAME);

2.3 唯一索引

唯一索引保证索引键值的唯一性,在创建主键或唯一约束时系统自动创建,也可手动创建。

适用场景:

  • 主键列
  • 业务唯一性约束(如身份证号、邮箱)
  • 避免重复数据插入

创建示例:

-- 自动创建(主键约束) CREATE TABLE STUDENT ( ID INT PRIMARY KEY, NAME VARCHAR(50) UNIQUE, EMAIL VARCHAR(255) ); -- 手动创建 CREATE UNIQUE INDEX idx_student_unique_email ON STUDENT(EMAIL);

2.4 函数索引

函数索引针对列表达式预先计算结果并建立索引,特别适合在查询条件中使用函数的场景。

适用场景:

  • 大小写不敏感查询
  • 日期函数处理
  • 数学函数计算

创建示例

-- 创建基于日期函数的索引 CREATE INDEX idx_emp_hire_year ON EMPLOYEE(YEAR(HIRE_DATE)); -- 大小写不敏感查询优化 CREATE INDEX idx_emp_name_upper ON EMPLOYEE(UPPER(NAME));

2.5 位图索引

位图索引使用位图表示数据分布,每个索引值对应一个位向量,适合低基数(重复值多)的列。

适用场景:

  • 性别、状态、类型等枚举字段
  • 多条件AND/OR组合查询

创建示例

CREATE TABLE TEACHER ( ID INT PRIMARY KEY, NAME VARCHAR(50) UNIQUE, GENDER SMALLINT DEFAULT 0 NOT NULL ); CREATE BITMAP INDEX idx_teacher_gender ON TEACHER(GENDER);

2.6 全文索引

全文索引专为大文本字段搜索设计,通过分词技术实现高效文本检索。

适用场景:

  • 文章内容搜索
  • 日志关键词检索
  • 产品描述搜索

创建示例

-- 创建表 CREATE TABLE ARTICLES ( ID INT PRIMARY KEY, TITLE VARCHAR(200), CONTENT TEXT ); -- 创建全文索引 CREATE CONTEXT INDEX ft_idx_content ON ARTICLES(CONTENT) LEXER DEFAULT_LEXER; -- 插入数据后重建索引 ALTER CONTEXT INDEX ft_idx_content ON ARTICLES REBUILD;

全文索引必须在基表定义,而不能在系统表,视图,临时表,列存表,外部表上定义,同一个列只能创建一个全文索引,在创建全文索引的时候,用户可以为分词器定义分词参数,即控制分词器的数量。

2.7 分区索引

分区表上创建的索引就是分区索引,非堆表每个分区一个索引(局部索引),堆表可以创建全局索引,也可以创建局部索引,在创建全局索引的时候指定 global 关键字。

类型对比:

特性 全局索引 局部索引
索引结构 整表一个B+树 每个分区独立索引
维护成本 高(跨分区维护) 低(分区独立维护)
查询性能 全表扫描快 指定分区查询更快
创建语法 加GLOBAL关键字 默认创建

适用场景:

  • 分区表条件查询

创建示例

-- 分区表定义 CREATE TABLE SALES ( SALE_ID INT, SALE_DATE DATE, AMOUNT DECIMAL(10,2) ) PARTITION BY RANGE(SALE_DATE) ( PARTITION P2022 VALUES LESS THAN ('2023-01-01'), PARTITION P2023 VALUES LESS THAN ('2024-01-01'), PARTITION P2024 VALUES LESS THAN (MAXVALUE) ); -- 全局索引 CREATE INDEX idx_global_sale_id ON SALES(SALE_ID) GLOBAL; -- 局部索引 CREATE INDEX idx_local_amount ON SALES(AMOUNT);

2.8 复合索引

在达梦数据库中,复合索引可以通过指定多个列来创建,以便在查询时能够更快地定位到符合条件的数据。复合索引可以提供更精确的查询结果,但也会占用更多的存储空间。因此,在创建复合索引时需要权衡查询性能和存储空间的需求。

适用场景:

  • 经常多条件查询

创建示例:

-- 创建订单表 CREATE TABLE ORDERS ( ORDER_ID BIGINT PRIMARY KEY, USER_ID INT NOT NULL, ORDER_STATUS VARCHAR(20) NOT NULL, TOTAL_AMOUNT DECIMAL(10,2), CREATE_TIME DATETIME NOT NULL, PAYMENT_TIME DATETIME ); -- 用户订单查询索引 CREATE INDEX idx_orders_user ON ORDERS(USER_ID, ORDER_STATUS, CREATE_TIME); -- 时间范围统计索引 CREATE INDEX idx_orders_create_time ON ORDERS(CREATE_TIME, ORDER_STATUS);

注意:

  • 最左前缀原则
    • 索引按定义顺序从左到右使用,查询条件必须包含最左列才能使用索引,跳列(中间列的条件不传入)查询会导致索引失效。
  • 列顺序选择策略(合理的列顺序是复合索引设计的核心)
    • 等值查询列在前:将=操作的列放在最左侧
    • 范围查询列在后:范围查询列(>, <, BETWEEN)放右侧
    • 高选择性列优先:唯一值比例高的列靠左
  • 复合索引的理想列数为2-4列,过多列会导致:
    • 索引体积膨胀,降低内存利用率
    • DML操作性能下降
    • 维护成本增加
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服