外观
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: 存储引擎对数据库备份没有直接影响,备份工具会自动处理不同存储引擎的数据。但不同存储引擎的备份大小和恢复时间可能会有所不同。
