Skip to content

DM 存储引擎

达梦数据库的存储引擎架构采用了插件式设计,允许用户根据业务需求选择合适的存储引擎。目前,达梦数据库支持以下几种主要的存储引擎:

  • 行存储引擎:适合OLTP(在线事务处理)应用
  • 列存储引擎:适合OLAP(在线分析处理)应用
  • 行列融合存储引擎:适合HTAP(混合事务/分析处理)应用

行存储引擎

行存储引擎是达梦数据库的默认存储引擎,以行为单位存储数据。

行存储引擎的原理

  • 数据存储方式:将一行数据的所有列值连续存储在一个数据页中
  • 数据结构:使用B+树索引组织数据,便于按行快速访问
  • 写操作:插入、更新和删除操作只需要修改或移动一行数据
  • 读操作:查询整行数据时效率高,但只查询部分列时会读取不必要的数据

行存储引擎的特点

  • 适合OLTP应用:适合频繁的插入、更新和删除操作
  • 高并发性能:支持高并发的事务处理
  • 适合点查询:适合根据主键或唯一键查询单行数据
  • 适合整行读取:适合需要读取整行数据的场景
  • 存储空间占用较大:存储一行数据时需要存储所有列值,包括NULL值

行存储引擎的适用场景

  • 在线交易系统:如电商平台、银行核心业务系统
  • 客户关系管理系统:需要频繁更新客户信息
  • 企业资源计划系统:包含大量的事务处理
  • 任何需要频繁更新数据的应用

列存储引擎

列存储引擎以列为单位存储数据,适合大规模数据的分析查询。

列存储引擎的原理

  • 数据存储方式:将同一列的数据连续存储在一个数据页中,不同列的数据存储在不同的数据页中
  • 数据压缩:同一列的数据具有相似性,便于进行高效的压缩
  • 读操作:查询部分列时只需要读取相关列的数据,减少了I/O操作
  • 写操作:插入、更新和删除操作需要修改多个列的数据,性能相对较低

列存储引擎的特点

  • 适合OLAP应用:适合大规模数据的分析查询
  • 高效的列查询:只查询部分列时效率高,减少了I/O操作
  • 高压缩率:同一列的数据具有相似性,压缩率通常在5-10倍
  • 适合聚合查询:适合进行SUM、AVG等聚合操作
  • 写操作性能较低:插入、更新和删除操作需要修改多个列的数据

列存储引擎的适用场景

  • 数据仓库系统:存储大规模历史数据
  • 商业智能系统:进行复杂的数据分析和报表生成
  • 大数据分析平台:处理TB级或PB级数据
  • 日志分析系统:分析大规模日志数据
  • 任何需要进行大规模数据分析的应用

行列融合存储引擎

行列融合存储引擎结合了行存储和列存储的优点,适合混合事务/分析处理应用。

行列融合存储引擎的原理

  • 混合存储方式:同时支持行存储和列存储,根据不同的查询类型自动选择合适的存储方式
  • 数据分区:将数据分为多个分区,每个分区可以选择不同的存储方式
  • 智能查询路由:根据查询类型将查询路由到合适的存储引擎
  • 数据同步:保持行存储和列存储之间的数据同步

行列融合存储引擎的特点

  • 适合HTAP应用:同时支持OLTP和OLAP应用
  • 自动适应工作负载:根据查询类型自动选择合适的存储方式
  • 平衡的性能:在事务处理和分析查询之间取得平衡
  • 灵活的配置:可以根据业务需求配置不同的存储策略
  • 较高的资源消耗:需要维护两种存储方式,资源消耗相对较高

行列融合存储引擎的适用场景

  • 实时数据分析系统:需要同时进行事务处理和实时分析
  • 互联网应用:需要同时支持在线交易和实时报表
  • 金融分析系统:需要同时处理交易数据和分析数据
  • 任何需要在同一系统中处理多种工作负载的应用

存储引擎的选择

选择合适的存储引擎对于数据库的性能和可靠性至关重要。在选择存储引擎时,需要考虑以下因素:

业务类型

  • OLTP应用:选择行存储引擎
  • OLAP应用:选择列存储引擎
  • 混合应用:选择行列融合存储引擎

数据规模

  • 小规模数据:行存储引擎足够满足需求
  • 大规模数据:考虑使用列存储引擎或行列融合存储引擎

查询模式

  • 频繁的点查询:选择行存储引擎
  • 频繁的范围查询:行存储引擎或列存储引擎均可
  • 频繁的聚合查询:选择列存储引擎
  • 复杂的分析查询:选择列存储引擎

写操作频率

  • 高频率写操作:选择行存储引擎
  • 低频率写操作:可以考虑使用列存储引擎

存储空间限制

  • 存储空间有限:考虑使用列存储引擎,其压缩率更高
  • 存储空间充足:可以根据其他因素选择合适的存储引擎

存储引擎的配置

表级存储引擎配置

可以在创建表时指定存储引擎:

sql
-- 创建行存储表
CREATE TABLE table_name (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT
) STORAGE(ENGINE = ROW);

-- 创建列存储表
CREATE TABLE table_name (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT
) STORAGE(ENGINE = COLUMN);

-- 创建行列融合存储表
CREATE TABLE table_name (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT
) STORAGE(ENGINE = HYBRID);

分区级存储引擎配置

对于分区表,可以为不同的分区指定不同的存储引擎:

sql
CREATE TABLE table_name (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    create_time DATE
)
PARTITION BY RANGE (create_time) (
    PARTITION p2023 VALUES LESS THAN ('2024-01-01') STORAGE(ENGINE = COLUMN),
    PARTITION p2024 VALUES LESS THAN ('2025-01-01') STORAGE(ENGINE = ROW)
);

存储引擎参数配置

可以通过dm.ini文件配置存储引擎的相关参数:

ini
-- 行存储引擎参数
ROW_ENGINE_MEMORY = 1024 -- 行存储引擎使用的内存大小(MB)
ROW_ENGINE_CACHE_SIZE = 512 -- 行存储引擎缓存大小(MB)

-- 列存储引擎参数
COLUMN_ENGINE_MEMORY = 2048 -- 列存储引擎使用的内存大小(MB)
COLUMN_ENGINE_COMPRESSION = LZ4 -- 列存储引擎使用的压缩算法
COLUMN_ENGINE_BLOCK_SIZE = 64 -- 列存储引擎块大小(KB)

-- 行列融合存储引擎参数
HYBRID_ENGINE_MEMORY = 3072 -- 行列融合存储引擎使用的内存大小(MB)
HYBRID_ENGINE_AUTO_SWITCH = 1 -- 启用自动存储引擎切换

存储引擎的性能比较

点查询性能

  • 行存储引擎:★★★★★
  • 列存储引擎:★★☆☆☆
  • 行列融合存储引擎:★★★★☆

范围查询性能

  • 行存储引擎:★★★☆☆
  • 列存储引擎:★★★★★
  • 行列融合存储引擎:★★★★☆

聚合查询性能

  • 行存储引擎:★★☆☆☆
  • 列存储引擎:★★★★★
  • 行列融合存储引擎:★★★★☆

插入操作性能

  • 行存储引擎:★★★★★
  • 列存储引擎:★★☆☆☆
  • 行列融合存储引擎:★★★☆☆

更新操作性能

  • 行存储引擎:★★★★★
  • 列存储引擎:★★☆☆☆
  • 行列融合存储引擎:★★★☆☆

删除操作性能

  • 行存储引擎:★★★★★
  • 列存储引擎:★★☆☆☆
  • 行列融合存储引擎:★★★☆☆

存储空间占用

  • 行存储引擎:★☆☆☆☆
  • 列存储引擎:★★★★★
  • 行列融合存储引擎:★★★☆☆

存储引擎的管理

查看表的存储引擎

可以使用以下语句查看表的存储引擎:

sql
SELECT TABLE_NAME, STORAGE_ENGINE FROM USER_TABLES WHERE TABLE_NAME = 'table_name';

修改表的存储引擎

可以使用ALTER TABLE语句修改表的存储引擎:

sql
ALTER TABLE table_name STORAGE(ENGINE = COLUMN);

监控存储引擎

达梦数据库提供了以下视图用于监控存储引擎的状态:

  • V$STORAGE_ENGINE:查看存储引擎的基本信息
  • V$ROW_ENGINE_STAT:查看行存储引擎的统计信息
  • V$COLUMN_ENGINE_STAT:查看列存储引擎的统计信息
  • V$HYBRID_ENGINE_STAT:查看行列融合存储引擎的统计信息

版本差异

DM7 存储引擎

  • 只支持行存储引擎
  • 基于B+树实现数据存储
  • 提供了基本的存储引擎功能

DM8 存储引擎

  • 支持三种存储引擎:行存储、列存储和行列融合存储
  • 优化了行存储引擎的性能和可靠性
  • 新增了列存储引擎,支持大规模数据分析
  • 新增了行列融合存储引擎,支持HTAP应用
  • 提供了更多的存储引擎配置选项
  • 增强了存储引擎的监控和管理功能

最佳实践

存储引擎选择建议

  • 根据业务类型选择:OLTP应用选择行存储,OLAP应用选择列存储,混合应用选择行列融合存储
  • 考虑数据生命周期:对于历史数据,可以考虑使用列存储引擎,减少存储空间占用
  • 使用分区表混合存储:对于分区表,可以为不同的分区选择不同的存储引擎
  • 进行性能测试:在实际环境中测试不同存储引擎的性能,选择最适合的存储引擎

性能优化建议

  • 优化行存储引擎

    • 合理设计索引,提高查询效率
    • 避免过度索引,影响写操作性能
    • 定期清理表碎片,提高存储效率
  • 优化列存储引擎

    • 选择合适的压缩算法,平衡压缩率和性能
    • 合理设计分区,提高查询效率
    • 避免频繁的写操作,影响性能
  • 优化行列融合存储引擎

    • 合理配置存储引擎参数,平衡性能和资源消耗
    • 根据查询类型优化表设计
    • 监控存储引擎的状态,及时调整配置

迁移建议

  • 从行存储迁移到列存储

    • 使用CREATE TABLE AS SELECT语句创建新表
    • 使用INSERT INTO SELECT语句迁移数据
    • 迁移完成后验证数据一致性
  • 从列存储迁移到行存储

    • 同样使用CREATE TABLE AS SELECT语句和INSERT INTO SELECT语句
    • 注意迁移过程中的性能影响

常见问题(FAQ)

Q1: 达梦数据库的默认存储引擎是什么?

A1: 达梦数据库的默认存储引擎是行存储引擎。

Q2: 可以在同一数据库中使用不同的存储引擎吗?

A2: 是的,可以在同一数据库中为不同的表选择不同的存储引擎。

Q3: 可以修改现有表的存储引擎吗?

A3: 是的,可以使用ALTER TABLE语句修改现有表的存储引擎,但修改过程会重建表,可能会影响性能。

Q4: 列存储引擎支持索引吗?

A4: 是的,列存储引擎支持索引,但索引的实现方式与行存储引擎不同,主要用于加速点查询。

Q5: 行列融合存储引擎如何决定使用哪种存储方式?

A5: 行列融合存储引擎会根据查询类型自动选择合适的存储方式,对于点查询使用行存储,对于分析查询使用列存储。

Q6: 存储引擎对数据库备份有影响吗?

A6: 存储引擎对数据库备份没有直接影响,备份工具会自动处理不同存储引擎的数据。但不同存储引擎的备份大小和恢复时间可能会有所不同。