在达梦数据库(DM)中,索引是提高数据检索效率的关键数据结构。索引的本质是通过对表中指定列的值进行排序,并建立到实际数据行的快速访问路径。类似于书籍的目录,索引使得数据库系统能够快速定位目标数据而无需全表扫描。在达梦数据库中,索引与表数据物理分离,采用B+树作为主要存储结构(位图索引、全文索引等特殊类型除外),这种设计在保证高效查询的同时,也确保了数据的独立性。
达梦数据库支持的索引有:聚簇索引、非聚簇索引、唯一索引、复合索引、函数索引、位图索引、全文索引、分区索引等。
每个普通表有且仅有一个聚簇索引,它决定了表中数据的物理存储顺序。创建聚簇索引时,系统按索引键值重构整个表的物理存储,将数据行直接存储在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);
非聚簇索引是用户最常创建的索引类型,每个表可创建多个。其叶子节点存储索引键值+聚簇索引键,当查询非索引列时需要回表查询。
适用场景:
创建示例:
-- 对EMPLOYEE表的NAME字段创建索引
CREATE INDEX idx_emp_name ON EMPLOYEE(NAME);
唯一索引保证索引键值的唯一性,在创建主键或唯一约束时系统自动创建,也可手动创建。
适用场景:
创建示例:
-- 自动创建(主键约束)
CREATE TABLE STUDENT (
ID INT PRIMARY KEY,
NAME VARCHAR(50) UNIQUE,
EMAIL VARCHAR(255)
);
-- 手动创建
CREATE UNIQUE INDEX idx_student_unique_email ON STUDENT(EMAIL);
函数索引针对列表达式预先计算结果并建立索引,特别适合在查询条件中使用函数的场景。
适用场景:
创建示例
-- 创建基于日期函数的索引
CREATE INDEX idx_emp_hire_year ON EMPLOYEE(YEAR(HIRE_DATE));
-- 大小写不敏感查询优化
CREATE INDEX idx_emp_name_upper ON EMPLOYEE(UPPER(NAME));
位图索引使用位图表示数据分布,每个索引值对应一个位向量,适合低基数(重复值多)的列。
适用场景:
创建示例
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);
全文索引专为大文本字段搜索设计,通过分词技术实现高效文本检索。
适用场景:
创建示例
-- 创建表
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;
全文索引必须在基表定义,而不能在系统表,视图,临时表,列存表,外部表上定义,同一个列只能创建一个全文索引,在创建全文索引的时候,用户可以为分词器定义分词参数,即控制分词器的数量。
分区表上创建的索引就是分区索引,非堆表每个分区一个索引(局部索引),堆表可以创建全局索引,也可以创建局部索引,在创建全局索引的时候指定 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);
在达梦数据库中,复合索引可以通过指定多个列来创建,以便在查询时能够更快地定位到符合条件的数据。复合索引可以提供更精确的查询结果,但也会占用更多的存储空间。因此,在创建复合索引时需要权衡查询性能和存储空间的需求。
适用场景:
创建示例:
-- 创建订单表
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);
注意:
文章
阅读量
获赞
