暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

大对象存储性能调优策略 | OceanBase最佳实践 18

原创 OceanBase数据库 2025-03-21
368

大对象(LOB,Large Object)是指数据库中存储的超大文本或二进制数据,如文本文档、图片、音频等。在数据库应用中,大对象常用于存储非结构化数据,为应用提供完整的数据存储解决方案。


OceanBase 数据库支持两种大对象存储方式:

👉 行内存储:数据直接存储在数据行中

  • 优势:读取性能好,无需额外 I/O。

  • 劣势:占用主表空间,影响其他列的访问效率。


👉 行外存储:数据存储在独立的对象存储中

  • 优势:节省主表空间,适合存储超大对象。

  • 劣势:需要额外 I/O,读取性能相对较差。


在实际应用中,行外存储的大对象(如 JSON)面临以下主要性能挑战:

👉 读取性能:对于行外存储的大对象,每次访问都需要额外的 I/O 操作。

👉 JSON 类型特殊性:需要解析结构信息,开销更大。频繁读写场景下性能表现不优。


注意:处理 LOB 字段开销较大的问题已在 4.2.2、4.3.1 及之后的版本中进行了优化。

一、性能诊断和优化方案

(一)识别行外存储性能问题

行外储存的性能不优时,主要特征有两个:

🚩 查询延迟明显增加

🚩 I/O 等待时间占比高


在性能诊断时,可以使用 EXPLAIN 分析执行计划,或者监控 I/O 相关性能指标。

(二)性能优化方案

1、采取智能存储策略

在处理大字段数据时,性能下降的主要原因是数据存储在行外,导致访问时的额外开销。可通过配置行内存储阈值,平衡存储空间和访问性能。具体可用方法如下:


通过 ob_default_lob_inrow_threshold 系统变量调大行内存储阈值,以避免行外存储。并重新建表进行测试。


示例如下:

-- 设置行内存储阈值为8192字节  SET ob_default_lob_inrow_threshold = 8192;


🧡注意:

修改 ob_default_lob_inrow_threshold 变量的值,不会影响已经创建表的行内存储阈值,只会影响新创建且没有指定行内阈值的表。


2、选择更合适的数据类型建表

在实践中,我们发现一些业务场景在使用 LONGTEXT 和 JSON 类型存储数据时,会出现存储效率低下和访问速度慢的问题,尤其是在不需要复杂查询的情况下。实际上,对于不需要进行 JSON 计算的纯 JSON 数据存储,可以考虑使用 VARCHAR 或 TEXT 类型。在数据量较大时,使用更小的存储类型可以减少内存占用和提高访问速度。


3、升级到合适的 OceanBase 版本

旧版本的 OceanBase 可能会出现无法充分利用新特性的情况。在高并发读写场景下,可以通过升级 OceanBase 版本进行性能调优。具体建议升级到 4.2.2、4.3.1 以及之后的版本,这些版本优化了行外储存场景,可以提高大对象和 JSON 的读写性能并降低延迟。

二、大对象存储性能示例

(一)测试场景

假设测试场景如下:

  • CPU架构:x86_64

  • CPU:4 核

  • OBServer版本号:4.2.1.7

(二)问题描述

假设这是一个带有 JSON 字段的主键查询场景,存在慢查询。具体 SQL 和表 DDL 如下:

SELECT  *FROM  `t2_act`WHERE  `id` = 1  AND `del_at` IS NULLLIMIT  1;
CREATE TABLE `t2_act` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL, `page_setting` JSON DEFAULT NULL, `rule_setting` JSON DEFAULT NULL, `extend` JSON DEFAULT NULL, `del_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`));

通过如下语句可以查询 JSON 字段的数据长度信息:

SELECT /*+parallel(12)*/ max(lengh(page_setting)), min(length(rule_setting)), avg(length(extend)) FROM t2_act;+--------------------------+--------------------------+--------------------+| max(lengh(page_setting)) | min(lengh(rule_setting)) | avg(lengh(extend)) ||                    17736 |                      928 |             113084 |+--------------------------+--------------------------+--------------------+1 row in set(0.196 sec)

可见,性能不佳的原因为该查询是涉及 JSON 列的查询,同时 JSON 列数据本身的长度超过了 LOB 行内存储的阈值,导致扫描 JSON 列数据需要额外的 I/O,进而导致 RT(响应时间)明显增加。

(三)优化方案

1️⃣ 升级到 OceanBase 4.2.2 及以上版本,以优化开销。


2️⃣ 调大行内阈值避免行外存储,调阈值后重建表格,使得数据按照新的存储机制存储。


3️⃣ 由于此场景不需要对 JSON 数据进行计算,只是纯粹地存储 JSON 数据,判断可以直接使用 Varchar 或 Text 类型进行存储。


在实际应用中,通过合理配置行内存储阈值、选择合适的数据类型以及升级到最新版本,可以有效提升大对象和 JSON 数据的存储与查询效率。通过这些优化策略,OceanBase 能够更好地满足高并发、大数据量的应用场景需求,为用户提供更高效的数据存储解决方案。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论