Skip to content

OceanBase 存储引擎优化

MemTable 优化

1. MemTable 大小调整

MemTable 大小直接影响写入性能和内存使用。合理调整 MemTable 大小可以平衡写入性能和内存消耗。

sql
-- 查看当前 MemTable 大小设置
SHOW PARAMETERS LIKE '%memtable%size%';

-- 调整 MemTable 大小(单位:字节)
ALTER SYSTEM SET memtable_size_limit = 1073741824; -- 1GB
ALTER SYSTEM SET memtable_max_size = 858993459; -- 0.8GB

2. MemTable 数量调整

调整 MemTable 数量可以提高并发写入性能,但会增加内存消耗。

sql
-- 查看当前 MemTable 数量设置
SHOW PARAMETERS LIKE '%memtable%count%';

-- 调整 MemTable 最大数量
ALTER SYSTEM SET memtable_max_active = 10;

3. MemTable 压缩设置

启用 MemTable 压缩可以减少内存使用,但会增加 CPU 消耗。

sql
-- 查看当前 MemTable 压缩设置
SHOW PARAMETERS LIKE '%memtable%compress%';

-- 启用 MemTable 压缩
ALTER SYSTEM SET memtable_compress_func = 'lz4_1.0';

SSTable 优化

1. SSTable 压缩算法选择

OceanBase 支持多种压缩算法,不同算法在压缩率和性能之间有不同的权衡:

压缩算法压缩率压缩速度解压速度适用场景
none1x最快最快对性能要求极高的场景
lz4_1.02-3x通用场景,平衡压缩率和性能
snappy2-3x通用场景
zstd_1.03-5x中等中等对压缩率要求较高的场景
zlib_1.03-5x对压缩率要求极高的场景
sql
-- 查看当前 SSTable 压缩设置
SHOW PARAMETERS LIKE '%compress_func%';

-- 调整 SSTable 压缩算法
ALTER SYSTEM SET compress_func = 'lz4_1.0';

2. SSTable 块大小调整

SSTable 块大小影响 I/O 效率和缓存命中率。较大的块大小可以提高顺序读取性能,但会降低随机读取性能。

sql
-- 查看当前 SSTable 块大小设置
SHOW PARAMETERS LIKE '%block_size%';

-- 调整 SSTable 块大小(单位:字节)
ALTER SYSTEM SET block_size = 16384; -- 16KB

3. SSTable 层级优化

调整 SSTable 层级参数可以优化合并过程,减少合并对系统性能的影响。

sql
-- 查看当前 SSTable 层级设置
SHOW PARAMETERS LIKE '%level%';

-- 调整 SSTable 层级参数
ALTER SYSTEM SET levels = 5;
ALTER SYSTEM SET level0_file_count_limit = 10;
ALTER SYSTEM SET level0_sstable_row_count_limit = 1000000;

Cache 优化

1. Block Cache 优化

Block Cache 用于缓存 SSTable 数据块,合理调整 Block Cache 大小可以提高读取性能。

sql
-- 查看当前 Block Cache 大小设置
SHOW PARAMETERS LIKE '%block_cache%size%';

-- 调整 Block Cache 大小(单位:字节)
ALTER SYSTEM SET block_cache_size = 4294967296; -- 4GB

2. Row Cache 优化

Row Cache 用于缓存热点行数据,适合频繁访问的小表。

sql
-- 查看当前 Row Cache 大小设置
SHOW PARAMETERS LIKE '%row_cache%size%';

-- 调整 Row Cache 大小(单位:字节)
ALTER SYSTEM SET row_cache_size = 2147483648; -- 2GB

3. Cache 淘汰策略调整

OceanBase 支持多种 Cache 淘汰策略,包括 LRU、LFU 等。

sql
-- 查看当前 Cache 淘汰策略
SHOW PARAMETERS LIKE '%cache%eviction%';

-- 调整 Cache 淘汰策略
ALTER SYSTEM SET block_cache_eviction_policy = 'lru';
ALTER SYSTEM SET row_cache_eviction_policy = 'lru';

Merge 机制优化

1. 合并触发条件调整

调整合并触发条件可以平衡写入性能和读取性能。

sql
-- 查看当前合并触发条件设置
SHOW PARAMETERS LIKE '%minor_merge%';
SHOW PARAMETERS LIKE '%major_merge%';

-- 调整合并触发条件
ALTER SYSTEM SET minor_merge_concurrency = 4;
ALTER SYSTEM SET major_merge_concurrency = 8;
ALTER SYSTEM SET freeze_trigger_percentage = 70;

2. 合并调度优化

优化合并调度可以减少合并对系统性能的影响,特别是在生产环境中。

sql
-- 查看当前合并调度设置
SHOW PARAMETERS LIKE '%merge%schedule%';

-- 调整合并调度参数
ALTER SYSTEM SET merge_limiter_ps = 104857600; -- 100MB/s
ALTER SYSTEM SET major_merge_duty_time = '22:00';
ALTER SYSTEM SET major_merge_idle_time = '06:00';

3. 合并优先级调整

调整合并优先级可以控制合并对系统资源的占用。

sql
-- 查看当前合并优先级设置
SHOW PARAMETERS LIKE '%merge%priority%';

-- 调整合并优先级
ALTER SYSTEM SET merge_priority = 5;

表设计优化

1. 分区表设计

合理的分区设计可以提高查询性能和并行处理能力。

sql
-- 范围分区示例
CREATE TABLE range_partition_table (
    id INT PRIMARY KEY,
    create_time DATETIME
) PARTITION BY RANGE (UNIX_TIMESTAMP(create_time)) (
    PARTITION p202401 VALUES LESS THAN (UNIX_TIMESTAMP('2024-02-01 00:00:00')),
    PARTITION p202402 VALUES LESS THAN (UNIX_TIMESTAMP('2024-03-01 00:00:00')),
    PARTITION p202403 VALUES LESS THAN (UNIX_TIMESTAMP('2024-04-01 00:00:00'))
);

-- 哈希分区示例
CREATE TABLE hash_partition_table (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) PARTITION BY HASH (id) PARTITIONS 8;

2. 索引优化

合理的索引设计可以提高查询性能,但过多的索引会影响写入性能。

sql
-- 创建合适的索引
CREATE INDEX idx_name ON user_table (name);

-- 创建联合索引
CREATE INDEX idx_name_age ON user_table (name, age);

-- 查看索引使用情况
EXPLAIN SELECT * FROM user_table WHERE name = 'OceanBase';

3. 数据类型优化

选择合适的数据类型可以减少存储空间,提高查询性能。

  • 尽量使用更小的数据类型(如 TINYINT 代替 INT)
  • 对于固定长度的字符串,使用 CHAR 类型
  • 对于可变长度的字符串,使用 VARCHAR 类型
  • 对于大文本数据,使用 TEXT 或 BLOB 类型

4. 表压缩设置

启用表级压缩可以减少存储空间,提高 I/O 性能。

sql
-- 创建表时启用压缩
CREATE TABLE compressed_table (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) COMPRESSION = 'lz4_1.0';

-- 修改现有表的压缩设置
ALTER TABLE existing_table COMPRESSION = 'zstd_1.0';

存储介质优化

1. 存储介质选择

根据数据访问频率和性能要求,选择合适的存储介质:

  • SSD:适合存储热点数据和 SSTable,提供高 IOPS 和低延迟
  • HDD:适合存储冷数据和备份数据,提供大容量和低成本

2. 存储目录配置

合理配置存储目录可以提高 I/O 性能,避免单点故障。

sql
-- 查看当前存储目录配置
SHOW PARAMETERS LIKE '%data_dir%';
SHOW PARAMETERS LIKE '%log_dir%';

-- 修改存储目录(需要重启 Observer)
ALTER SYSTEM SET data_dir = '/data1/oceanbase,/data2/oceanbase';
ALTER SYSTEM SET log_dir = '/log1/oceanbase,/log2/oceanbase';

3. I/O 调度策略调整

调整操作系统 I/O 调度策略可以提高存储性能。

bash
# 查看当前 I/O 调度策略
cat /sys/block/sda/queue/scheduler

# 修改 I/O 调度策略为 deadline
echo deadline > /sys/block/sda/queue/scheduler

写入性能优化

1. 批量写入优化

使用批量写入可以减少网络开销和事务提交开销,提高写入性能。

sql
-- 批量插入示例
INSERT INTO test_table (id, name) VALUES
(1, 'OceanBase'),
(2, 'MySQL'),
(3, 'PostgreSQL'),
(4, 'Oracle');

-- 批量更新示例
UPDATE test_table SET name = CONCAT(name, '_updated') WHERE id IN (1, 2, 3, 4);

2. 事务大小优化

合理控制事务大小可以提高并发性能,避免长时间持有锁。

sql
-- 避免大事务
-- 错误示例:单事务插入大量数据
INSERT INTO large_table SELECT * FROM source_table; -- 不推荐

-- 正确示例:分批次插入
INSERT INTO large_table SELECT * FROM source_table WHERE id BETWEEN 1 AND 10000;
INSERT INTO large_table SELECT * FROM source_table WHERE id BETWEEN 10001 AND 20000;

3. 写入模式调整

OceanBase 支持多种写入模式,包括异步写入和同步写入。

sql
-- 查看当前写入模式设置
SHOW PARAMETERS LIKE '%write%mode%';

-- 调整写入模式
ALTER SYSTEM SET write_mode = 'async';

读取性能优化

1. 预读优化

启用预读可以提高顺序读取性能。

sql
-- 查看当前预读设置
SHOW PARAMETERS LIKE '%prefetch%';

-- 启用预读
ALTER SYSTEM SET prefetch_row_count = 100;

2. 并行查询优化

启用并行查询可以提高复杂查询的性能。

sql
-- 查看当前并行查询设置
SHOW PARAMETERS LIKE '%parallel%';

-- 调整并行查询参数
ALTER SYSTEM SET parallel_servers_target = 64;
ALTER SYSTEM SET parallel_servers_capacity = 128;

3. 读取缓存优化

合理使用读取缓存可以提高查询性能。

sql
-- 查看当前读取缓存设置
SHOW PARAMETERS LIKE '%read%cache%';

-- 调整读取缓存参数
ALTER SYSTEM SET read_cache_size = 1073741824; -- 1GB

监控与调优

1. 存储引擎监控指标

指标名称说明监控工具
memtable_count当前活跃 MemTable 数量OCP、Prometheus
memtable_usageMemTable 内存使用情况OCP、Prometheus
sstable_countSSTable 文件数量OCP、Prometheus
block_cache_hit_rateBlock Cache 命中率OCP、Prometheus
row_cache_hit_rateRow Cache 命中率OCP、Prometheus
merge_times合并操作次数OCP、Prometheus
merge_duration合并操作持续时间OCP、Prometheus

2. 性能分析工具

  • OCP:OceanBase 云平台,提供全面的监控和性能分析功能
  • Prometheus + Grafana:开源监控解决方案,可用于监控 OceanBase 存储引擎指标
  • Trace Log:用于分析 SQL 执行过程和性能瓶颈
  • Plan Cache:用于分析执行计划和查询性能

3. 常见性能问题排查

问题症状可能原因解决方案
写入性能下降MemTable 已满、合并操作频繁、I/O 瓶颈调整 MemTable 大小、优化合并策略、升级存储介质
读取性能下降Cache 命中率低、SSTable 数量过多、I/O 瓶颈调整 Cache 大小、优化合并策略、升级存储介质
内存使用率高MemTable 过大、Cache 配置过高、数据量增长调整 MemTable 大小、优化 Cache 配置、清理过期数据
CPU 使用率高合并操作频繁、压缩算法消耗大、查询并发高优化合并策略、调整压缩算法、优化查询语句

最佳实践

  1. 根据业务场景调整参数:不同业务场景需要不同的存储引擎配置,应根据实际情况调整参数
  2. 定期监控和调优:定期监控存储引擎指标,及时发现和解决性能问题
  3. 合理规划存储容量:预留足够的存储空间,避免存储容量不足导致性能下降
  4. 使用 SSD 存储:对于生产环境,推荐使用 SSD 存储以获得更好的性能
  5. 定期进行合并操作:定期手动触发合并操作,避免 SSTable 数量过多导致性能下降
  6. 合理设计表结构:根据业务需求,合理设计表结构和索引
  7. 使用批量操作:对于大量数据写入,使用批量操作提高性能
  8. 避免大事务:将大事务拆分为多个小事务,提高并发性能

常见问题(FAQ)

Q1: 如何判断存储引擎性能是否存在瓶颈?

A1: 可以通过以下指标判断存储引擎性能是否存在瓶颈:

  • MemTable 使用率持续接近 100%
  • Cache 命中率低于 80%
  • 合并操作频繁且持续时间长
  • I/O 使用率持续高于 80%
  • CPU 使用率持续高于 80%

Q2: 如何手动触发合并操作?

A2: 可以使用以下命令手动触发合并操作:

sql
-- 触发 minor merge
ALTER SYSTEM MINOR FREEZE;

-- 触发 major merge
ALTER SYSTEM MAJOR FREEZE;

-- 触发指定表的 major merge
ALTER SYSTEM MAJOR FREEZE TENANT = 'test_tenant' TABLE = 'test_table';

Q3: 如何查看当前合并状态?

A3: 可以使用以下命令查看当前合并状态:

sql
-- 查看合并状态
SELECT * FROM oceanbase.__all_zone WHERE name = 'merge_status';

-- 查看合并进度
SELECT * FROM oceanbase.__all_rootservice_event_history WHERE event LIKE '%merge%';

Q4: 如何优化大表查询性能?

A4: 优化大表查询性能可以采取以下措施:

  • 合理设计分区表
  • 创建合适的索引
  • 优化查询语句,避免全表扫描
  • 调整 Cache 大小,提高 Cache 命中率
  • 使用并行查询
  • 定期进行 major merge

Q5: 存储引擎参数调整后需要重启吗?

A5: 大部分存储引擎参数支持动态调整,不需要重启 Observer。但部分参数(如 data_dir、log_dir 等)需要重启 Observer 才能生效。可以通过以下命令查看参数是否支持动态调整:

sql
SHOW PARAMETERS LIKE '%param_name%' WHERE scope = 'GLOBAL' AND type = 'dynamic';

Q6: 如何选择合适的压缩算法?

A6: 选择压缩算法时需要权衡压缩率和性能:

  • 对于对性能要求较高的场景,推荐使用 lz4_1.0
  • 对于对压缩率要求较高的场景,推荐使用 zstd_1.0
  • 对于平衡点场景,推荐使用 snappy

Q7: 如何监控存储引擎的内存使用情况?

A7: 可以使用以下命令监控存储引擎的内存使用情况:

sql
-- 查看内存使用情况
SELECT * FROM oceanbase.__all_virtual_memory_info;

-- 查看 MemTable 内存使用情况
SELECT * FROM oceanbase.__all_virtual_memtable_info;

-- 查看 Cache 内存使用情况
SELECT * FROM oceanbase.__all_virtual_cache_info;

Q8: 如何优化高并发写入场景下的存储引擎性能?

A8: 优化高并发写入场景下的存储引擎性能可以采取以下措施:

  • 增加 MemTable 数量和大小
  • 启用 MemTable 压缩
  • 调整合并触发条件,减少合并频率
  • 使用批量写入
  • 优化事务大小,避免大事务
  • 使用 SSD 存储,提高 I/O 性能