DongSQL V1.2.0发布:持续深耕零售数据库内核,性能与稳定性双重跃升
引言
继DongSQL V1.1.0在2025年9月《京东自研电商数据库内核DongSQL简介》发布后,京东零售数据库团队持续深耕数据库内核技术,经过半年的打磨,正式推出DongSQL V1.2.0版本。新版本在热点行更新优化、主从复制性能、执行计划缓存、带量压测支持、海量表启动速度、SIMD加速等多个维度实现了重大突破,为零售高性能数据库需求提供了更强大的内核支撑能力。
本文将深度解析DongSQL V1.2.0的核心技术升级,以及在各种场景下的性能表现。

图1:DongSQL V1.2.0架构总览(★标注为V1.2.0新增特性)
1、组提交性能优化
1.1 组提交单播通知
▶︎ 优化背景:在DongSQL组提交过程中,follower线程需要等待leader完成binlog刷盘后才能继续执行。传统方式使用单一条件变量(COND_done)广播唤醒所有等待的follower线程,当并发线程数较多时,广播唤醒会导致严重的锁竞争,成为性能瓶颈。
▶︎ 技术方案:DongSQL V1.2.0为每个线程分配独立的条件变量(THD::COND_wakeup_ready),将广播唤醒改为逐个单播唤醒。leader线程完成刷盘后,遍历follower队列逐个唤醒,大幅减少对共享条件变量的锁竞争。
▶︎ 核心优势:
•适用于所有开启主从复制的场景
•每个线程独立等待,避免广播唤醒的惊群效应
•高并发写入场景效果显著,低并发场景性能持平
▶︎ 测试环境:16C32G,sysbench 16张表每张1000万行
▶︎ 性能测试数据:
测试场景 | 低并发表现 | 中高并发提升 |
oltp_insert | 持平 | 150-200% |
oltp_write_only | 持平 | 30% |
oltp_update_non_index | 持平 | 100-120% |
oltp_update_index | 持平 | 70-90% |
oltp_delete | 持平 | 85% |
oltp_insert详细数据:
线程数 | 关闭QPS | 开启QPS | 提升幅度 |
64 | 25,239 | 28,278 | 12% |
128 | 27,549 | 42,598 | 55% |
256 | 24,136 | 54,352 | 125% |
512 | 25,651 | 73,966 | 188% |
1024 | 29,983 | 77,623 | 159% |
oltp_update_non_index详细数据:
线程数 | 关闭QPS | 开启QPS | 提升幅度 |
64 | 25,597 | 29,225 | 14% |
128 | 28,390 | 44,795 | 58% |
256 | 25,376 | 58,708 | 131% |
512 | 28,034 | 78,206 | 179% |
1024 | 34,431 | 78,360 | 128% |
oltp_delete详细数据:
线程数 | 关闭QPS | 开启QPS | 提升幅度 |
64 | 112,809 | 129,668 | 15% |
128 | 96,091 | 209,081 | 118% |
256 | 92,488 | 194,071 | 110% |
-- 启用组提交单播通知(默认开启) SET GLOBAL binlog_group_commit_unicast_mode = ON;

图2:组提交单播通知性能对比(开启单播通知后,高并发写入场景性能显著提升)
2、半同步复制性能优化
▶︎ 在刷盘后更新binlog end position:优化binlog位点更新时机,在刷盘完成后立即更新end position,减少从库等待延迟。
▶︎ ACK时刷新中继日志:半同步复制在收到从库ACK时立即刷新中继日志,确保数据一致性同时优化复制性能。
▶︎ 事务侧和日志侧双重优化:从中继日志侧和事务侧两个维度进行优化,全面提升复制效率。
▶︎ 性能测试数据:
基于sysbench oltp_write_only场景测试(20张表,每张1000万行,主从半同步架构):
参数组合 | 说明 |
第一组 | 两个参数均关闭(基线) |
第二组 | rpl_update_binlog_end_pos_after_flush=ON(主库优化) |
第三组 | rpl_semi_sync_flush_relay_log_on_ack=ON(从库优化) |
第四组 | 两个参数均开启(双重优化) |
DongSQL 8.0 性能提升:
线程数 | 第二组提升 | 第三组提升 | 第四组提升 |
低并发(≤128线程) | 6% | 18% | 25% |
高并发(256线程) | -2% | -12% | -18% |
DongSQL 5.7 性能提升:
线程数 | 第二组提升 | 第三组提升 | 第四组提升 |
低并发(≤256线程) | 5% | 3% | 7% |
高并发(≥512线程) | 持平 | 持平 | 持平 |
-- 相关系统变量 rpl_update_binlog_end_pos_after_flush = ON -- 主库生效 rpl_semi_sync_flush_relay_log_on_ack = ON -- 从库生效

图3:半同步复制优化性能对比(低并发场景显著提升,8.0 最高提升25%)
3、执行计划缓存
3.1 功能概述
▶︎ 技术痛点:之前版本DongSQL每次执行SQL语句时都需要重新生成执行计划,对于频繁执行的相同SQL,重复生成执行计划会消耗大量CPU资源。
▶︎ 解决方案:DongSQL V1.2.0引入执行计划缓存(Plan Cache)功能,缓存SELECT语句的执行计划,避免重复生成执行计划,显著提升查询性能。
-- 开启执行计划缓存 SET GLOBAL plan_cache_enabled = ON; -- 查看缓存状态 SHOW STATUS LIKE 'plan_cache%';
3.2 性能提升
▶︎ 测试场景:基于sysbench标准测试(8C16G,10张表每张100万行),对比开启和关闭执行计划缓存的性能差异。
▶︎ 性能测试数据:
测试场景 | 低并发提升 | 高并发提升 |
oltp_read_only | 1-5% | 1-5% |
select_random_ranges | 22-33% | 56-136% |
select_random_points | 25-36% | 71-206% |
select_random_ranges 详细数据:
线程数 | 关闭QPS | 开启QPS | 提升幅度 |
2 | 10,163 | 12,403 | 22% |
4 | 18,371 | 22,935 | 25% |
8 | 33,776 | 44,895 | 33% |
16 | 33,402 | 52,239 | 56% |
32 | 23,485 | 41,145 | 75% |
64 | 15,740 | 37,152 | 136% |
select_random_points 详细数据:
线程数 | 关闭QPS | 开启QPS | 提升幅度 |
2 | 11,352 | 14,288 | 26% |
4 | 20,025 | 25,877 | 29% |
8 | 35,384 | 47,994 | 36% |
16 | 34,532 | 59,309 | 72% |
32 | 22,075 | 45,974 | 108% |
64 | 11,911 | 36,498 | 206% |
▶︎ 最佳实践:执行计划缓存特别适用于以下场景:
•频繁执行相同SQL模式的查询
•OLTP类型的高并发短查询
•预编译语句和参数化查询

图4:执行计划缓存开启前后QPS对比(select_random_ranges与select_random_points场景)
4、单点查询优化增强
4.1 功能扩展
▶︎ V1.1.0回顾:DongSQL V1.1.0首次引入单点查询bypass功能,针对主键等值查询绕过部分SQL层处理逻辑,直接访问存储引擎。
▶︎ V1.2.0增强:新版本大幅扩展了单点查询优化的支持范围:
•索引类型扩展:新增支持唯一索引(Unique Index)
•数据类型扩展:新增支持VARCHAR、CHAR类型
-- 支持主键查询优化 SELECT * FROM orders WHERE order_id = 1001; -- 主键INT类型 -- 支持唯一索引查询优化 SELECT * FROM users WHERE email = 'user@example.com'; -- 唯一索引VARCHAR类型 -- 支持CHAR类型 SELECT * FROM products WHERE product_code = 'ABC123'; -- 唯一索引CHAR类型
▶︎ 注意事项:
•应用条件:单表主键/唯一索引查询
4.2 性能提升
▶︎ 测试环境:8C16G,16张表每张100万行,sysbench oltp_point_select场景
DongSQL 8.0 性能测试数据:
查询类型 | 低并发提升 | 高并发提升 | 低并发CPU降低 | 高并发延迟降低 |
整型主键 | 6-9% | 19-23% | 1-7% | 16-19% |
整型唯一索引 | 6-16% | 17-19% | 2-6% | 15-16% |
VARCHAR唯一索引 | 7-18% | 16-21% | 1-6% | 14-18% |
VARCHAR主键 | 5-14% | 19-23% | 1-4% | 17-20% |
DongSQL 5.7 性能测试数据:
查询类型 | 低并发提升 | 高并发提升 | 低并发CPU降低 | 高并发延迟降低 |
整型主键 | 6-9% | 17-20% | 7-13% | 11-17% |
整型唯一索引 | 4-7% | 15-19% | 3-18% | 14-17% |
VARCHAR唯一索引 | 3-10% | 12-15% | 2-4% | 12-13% |
VARCHAR主键 | 4-8% | 14-15% | 4-9% | 9-13% |
整型主键查询详细数据(DongSQL 8.0):
线程数 | 优化前QPS | 优化后QPS | 提升幅度 | CPU下降 | 延迟降低 |
2 | 24,709 | 26,705 | 8.1% | 1.6% | - |
4 | 48,119 | 51,549 | 7.1% | 1.0% | - |
8 | 93,322 | 99,641 | 6.8% | 3.7% | - |
16 | 174,917 | 189,938 | 8.6% | 7.0% | - |
32 | 147,072 | 179,666 | 22.2% | - | 18.2% |
64 | 106,530 | 126,914 | 19.1% | - | 16.7% |

图5:单点查询优化QPS对比(多维度性能提升汇总)
5、海量表极速启动
5.1 技术痛点
▶︎ 问题背景:DongSQL在启动时需要扫描所有表空间文件来获取space id信息,传统方式是读取每个文件的第一个页。当实例中存在大量表(数十万甚至百万级别)时,启动时间会显著延长。
▶︎ 典型场景:DongDAL的分库分表架构,单实例可能包含数十万张表,启动时间可达数十秒甚至分钟级别。
5.2 解决方案
▶︎ 技术创新:DongSQL V1.2.0使用文件扩展属性(xattr)保存表空间文件的space id信息,启动时直接从文件属性读取,无需解析每个文件的第一个页。
-- 系统变量 innodb_fast_initial_fil_scan = ON -- 默认开启 -- 查看文件的xattr属性 getfattr ./t1.ibd -n user.dongsql.space_id
▶︎ 技术特点:
•自动写入xattr:创建表时自动写入space id到文件扩展属性
•兼容性保证:旧版本升级后首次启动会自动补全xattr
•安全机制:检测到xattr冲突或错误时自动修复
•动态开关:支持运行时动态开启/关闭
5.3 性能突破
▶︎ 测试环境:8C16G128G DongSQL实例
表空间扫描时间对比:
表数量 | 场景 | 关闭(秒) | 开启(秒) | 扫描时间缩短 |
20万张表 | 崩溃恢复 | 3.72 | 0.62 | 83% |
100万张表 | 崩溃恢复 | 18.62 | 3.36 | 82% |
100万张表 | 正常启动 | 18.57 | 3.70 | 80% |
100万张表 | 高负载崩溃恢复 | 18.74 | 3.59 | 81% |
整体启动时间对比:
表数量 | 场景 | 关闭(秒) | 开启(秒) | 整体时间缩短 |
20万张表 | 崩溃恢复 | 18.5 | 16.5 | 11% |
100万张表 | 崩溃恢复 | 101 | 88 | 13% |
100万张表 | 正常启动 | 106 | 90 | 15% |
100万张表 | 高负载崩溃恢复 | 157 | 142 | 10% |
▶︎ 业务价值:
•大幅缩短故障恢复时间,提升系统可用性
•加速容器化部署和弹性扩容场景
•特别适用于分库分表架构下的海量表实例

图6:表空间扫描与启动时间对比(20万/100万张表场景)
6、SIMD性能优化
6.1 SQL摘要SIMD加速
▶︎ 技术背景:SQL摘要(Digest Hash)是数据库性能分析和监控的核心功能,用于识别相同模式的SQL语句。在高并发场景下,SQL摘要计算成为性能瓶颈之一。尤其是之前版本发布的限流功能,也高度依赖SQL摘要计算。
▶︎ AVX2指令集优化:DongSQL V1.2.0使用AVX2指令集优化DIGEST_HASH_TO_STRING函数,利用SIMD(单指令多数据)并行计算能力,显著提升SQL摘要转换性能。
-- 系统变量(默认开启) enable_digest_hash_to_string_avx2 = ON
6.2 性能测试数据
▶︎ 测试环境:8C 16G,DongSQL 8.0,16张表每张100万行
▶︎ 测试场景对比:
测试场景 | 无AVX2优化 | 有AVX2优化 | 提升幅度 |
oltp_point_select | 114,548 QPS (32线程) | 122,244 QPS (32线程) | 10% |
oltp_read_only | 80,568 QPS (16线程) | 87,056 QPS (16线程) | 8% |
oltp_write_only | 40,376 QPS (16线程) | 43,217 QPS (16线程) | 5% |
oltp_read_write | 50,334 QPS (16线程) | 53,320 QPS (16线程) | 6% |
详细数据对比(oltp_point_select场景):
线程数 | 基准QPS | AVX2优化QPS | 提升幅度 |
2 | 16,505 | 17,162 | 4.0% |
4 | 34,024 | 35,578 | 4.6% |
8 | 67,924 | 69,757 | 2.7% |
16 | 125,699 | 131,139 | 4.3% |
32 | 114,548 | 122,244 | 6.7% |
64 | 92,084 | 98,333 | 6.8% |
▶︎ 适用条件:CPU需支持AVX2指令集(Intel Haswell及以后、AMD Excavator及以后)

图7:AVX2指令集优化性能对比(oltp_point_select场景详细数据与多场景对比)
7、Statement Outline(5.7版本)
7.1 功能移植
▶︎ 背景:DongSQL V1.1.0在8.0版本引入了Statement Outline功能,用于固化SQL执行计划。为满足存量业务需求,V1.2.0将该功能移植到DongSQL 5.7版本。
▶︎ 核心能力:
•执行计划固化:绑定特定SQL到固定执行计划
•Hint注入:动态为SQL添加优化提示
•应急干预:快速解决线上SQL性能问题
-- 为特定SQL添加索引提示 CALL dbms_outln.add_index_outline( 'ecommerce_db', '', 1, 'USE INDEX', 'idx_status', '', 'SELECT * FROM orders WHERE status = "PAID"' ); -- 为问题SQL添加限流Hint CALL dbms_outln.add_optimizer_outline( 'ecommerce_db', '', 1, '/*+ ccl_queue_digest(5) */', 'SELECT * FROM hot_products WHERE status = 1' );
7.2 应用场景
▶︎ 执行计划不稳定:防止因数据变化、统计信息更新导致的执行计划劣化
▶︎ 应急限流:突发流量场景下快速对问题SQL进行限流
▶︎ 性能基线保护:为核心SQL绑定最优执行计划,确保性能稳定
8、热点行更新优化
8.1 功能背景
▶︎ 业务痛点:在余额扣减、库存秒杀、高并发发号器等典型业务场景中,短时间内会出现针对同一数据行的海量更新操作,即热点行更新问题。海量并发的单行UPDATE语句同时争夺同一行数据的修改权限,导致数据库内部产生大量锁等待与锁竞争。
▶︎ 核心瓶颈:
•行锁冲突:UPDATE遵循两阶段加锁协议,同一时间只有一个事务能更新某一行,其他事务需串行等待
•半同步复制延迟:事务提交阶段必须等待备库ACK响应后才能释放行级排他锁(X锁),网络延迟进一步延长锁持有时间
•B+树索引高频遍历:每次查找行数据需从根节点自顶向下遍历B+树,单表数据量越大耗时越长
•死锁检测开销:热点行更新场景下锁等待关系图急剧膨胀,死锁检测消耗大量CPU,DongSQL 5.7中每次加锁失败都需检测死锁并持全局锁
▶︎ 传统方案局限:此前DongSQL第一版优化通过Hint排队限流+快速提交,虽能减少死锁检测开销,但未改变UPDATE串行执行的本质。在半同步复制环境下,单热点行理论TPS上限仅约500-1000,无法满足高并发业务需求。
8.2 技术方案
▶︎ 核心思路:摒弃"串行等锁"传统思路,引入SQL层缓存的更新批量合并机制,从根本上打破UPDATE串行执行和网络延迟的物理瓶颈。
▶︎ 更新批量合并机制:
•SQL层行缓存:在SQL层维护InnoDB行数据完整缓存,配备互斥锁保障并发安全
•双更新单元:每行数据配备两个交替执行的更新单元,确保同一时间只有一个单元持有行级排他锁(X锁)
•Leader-Follower模式:
◦Leader线程进入InnoDB获取X锁,完成数据更新后写入SQL层缓存,等待收集Follower
◦Follower线程直接从SQL层缓存读取数据、执行更新、写回缓存,无需进入InnoDB
◦Leader统一处理Redo Log与Binlog落盘,完成后唤醒所有Follower
▶︎ 关键优化点:
•减少B+树遍历:仅Leader线程需遍历B+树,Follower直接从缓存获取数据
•减少死锁检测:更新合并大幅降低并发挂起线程数量,缩减锁等待关系图规模
•平摊网络延迟:单次半同步复制ACK被整个更新单元共享,降低每条UPDATE平均等待时间
•Crash Recovery安全:通过Binlog完整性标记机制,将更新单元绑定为逻辑整体,确保异常重启后主备数据一致
-- 使用热点行更新(必须包含 COMMIT_ON_SUCCESS Hint) UPDATE /*+ COMMIT_ON_SUCCESS */ t1 SET val = val + 1 WHERE id = 1; -- 系统变量 SET GLOBAL hotspot = ON; -- 开启热点行更新 SET GLOBAL hotspot_for_autocommit = ON; -- 对autocommit模式的UPDATE也启用 SET GLOBAL hotspot_for_trigger = ON; -- 允许有UPDATE Trigger的表启用 SET GLOBAL hotspot_update_max_wait_time = 5000000; -- Leader等待Follower的最大时间(微秒)
8.3 性能测试数据
▶︎ 测试环境:8C 16G,DongSQL 8.0,单表10条数据,针对id=1的行做热点更新
▶︎ 测试SQL:
UPDATE /*+ COMMIT_ON_SUCCESS */ sbtest1 SET k = k + 1 WHERE id = 1;
热点行更新性能对比:
线程数 | 关闭 TPS | 开启 TPS | 关闭延迟(ms) | 开启延迟(ms) | 提升幅度 |
1 | 3,007 | 1,997 | 0.33 | 0.50 | -33.6% |
2 | 4,639 | 4,057 | 0.43 | 0.49 | -12.5% |
4 | 4,579 | 7,554 | 0.87 | 0.53 | 65.0% |
8 | 4,523 | 12,269 | 1.77 | 0.65 | 171.2% |
16 | 4,250 | 15,636 | 3.76 | 1.02 | 267.9% |
32 | 4,012 | 19,968 | 7.98 | 1.60 | 397.7% |
64 | 3,903 | 27,618 | 16.39 | 2.32 | 607.5% |
128 | 3,714 | 34,127 | 34.46 | 3.78 | 818.9% |
256 | 3,521 | 33,308 | 72.69 | 7.68 | 846.0% |
512 | 3,106 | 32,172 | 164.75 | 16.34 | 935.5% |
1024 | 2,369 | 29,765 | 431.72 | 34.26 | 1155.6% |
▶︎ 测试结论:
•低并发场景(≤2线程):开启hotspot后性能下降约10%-30%,因合并机制引入额外开销
•高并发场景(≥4线程):性能显著提升,128线程达到峰值34,127 TPS,相比基线提升约9倍
•开启hotspot后,高并发下平均延迟从72.69ms降至3.78ms,降低95%
•峰值性能后(128+线程),因CPU饱和,TPS略有回落但维持3万+
▶︎ 最佳实践:
•适用于高并发热点行更新场景(库存扣减、余额更新、发号器等)
•低并发场景不建议启用,可能引入额外开销
•必须配合/*+ COMMIT_ON_SUCCESS */ Hint使用
•确保满足使用限制条件(主键/唯一索引等值查询、非分区表等)

图8:热点行更新开启前后TPS对比(高并发下性能提升显著,128线程峰值达34,127 TPS)
9、带量压测支持
9.1 功能背景
▶︎ 业务痛点:在业务侧原有的压测流程中,需要新建一个压测实例,并把所有数据复制一份到新建的压测实例中,所有压测流量接入到独立的压测实例。为了降本增效,业务侧推进带量压测项目——直接在原实例上新建压测表(以_bak_bak为后缀),压测流量打到压测表上,业务SQL仍操作原表。
▶︎ 核心问题:由于压测流量巨大,而压测期间业务的普通用户SQL量较少,数据库会被压测SQL大量占用CPU时间片,导致普通用户SQL出现超时、饿死或执行延迟过高的问题。
▶︎ 解决方案:DongSQL V1.2.0在线程池中新增低优先级队列,通过DONGSQL_LOW_PRIO Hint标识压测SQL,将其路由到低优先级队列执行,业务SQL保持普通优先级,确保业务SQL优先得到执行。
9.2 技术实现
▶︎ 架构设计:带量压测的实现由三个模块组成:
•自动开启模块:每次带有压测Hint的SQL进入DongSQL时,在执行期间识别到Hint后自动打开流量检测开关
•流量检测模块:线程池检测到流量检测开关打开后,在SQL任务进入线程池任务队列之前,通过MSG_PEEK技术预读网络包前N个字节,识别SQL是否包含压测Hint,若包含则放入低优先级队列
•自动关闭模块:后台监控线程周期性检测,当检测到当前不在压测状态时,自动关闭流量检测开关,降低流量检测对非压测期间数据库性能的影响
▶︎ 核心创新:
•MSG_PEEK预读技术:在网络包阶段(尚未解析SQL)即可提前获取SQL前缀,不影响后续网络包的正常处理
•自动开关机制:压测流量进来时第一时间开启检测,压测流量消失后30秒内自动关闭检测,确保非压测期间零性能开销
-- 压测SQL示例(带有DONGSQL_LOW_PRIO Hint的SQL会被放入低优先级队列) SELECT /*+ DONGSQL_LOW_PRIO */ id, name FROM user WHERE age > 18; UPDATE /*+ DONGSQL_LOW_PRIO */ user SET age = 21 WHERE id = 1; -- 业务正常SQL(不带Hint,保持普通优先级,优先执行) SELECT id, name FROM user WHERE age > 18; UPDATE user SET age = 21 WHERE id = 1;
▶︎ 相关系统变量:
•enable_high_volume_testing:带量压测功能开关(默认ON)
•load_testing_disable_cycle_period:自动关闭检测的周期间隔(默认30秒)
9.3 性能测试数据
▶︎ 测试环境:8C 16G,DongSQL 8.0开启线程池,sysbench 16张表每张100万行,oltp_read_write场景
▶︎ 测试方式:固定用户流量并发数,逐步增加压测流量并发数(32-512),对比开启/关闭低优先级Hint时用户流量的TPS和延迟表现。
用户并发数=8,压测并发数递增:
压测并发数 | 关闭TPS | 开启TPS | TPS提升 | 关闭QPS | 开启QPS | QPS提升 | 关闭平均延迟(ms) | 开启平均延迟(ms) | 延迟降低 | 关闭tp99(ms) | 开启tp99(ms) | tp99降低 |
32 | 740 | 766 | 3.6% | 14,790 | 15,321 | 3.6% | 10.82 | 10.44 | 3.5% | 53.85 | 54.83 | 持平 |
64 | 411 | 615 | 49.6% | 8,227 | 12,306 | 49.6% | 19.45 | 13.00 | 33.2% | 73.13 | 73.13 | 持平 |
128 | 220 | 649 | 195% | 4,403 | 12,975 | 195% | 36.33 | 12.33 | 66.1% | 89.16 | 74.46 | 16.5% |
256 | 118 | 647 | 448% | 2,365 | 12,947 | 448% | 67.66 | 12.36 | 81.7% | 112.67 | 73.13 | 35.1% |
512 | 65 | 657 | 911% | 1,307 | 13,150 | 911% | 122.39 | 12.17 | 90.1% | 215.44 | 73.13 | 66.1% |
用户并发数=32,压测并发数递增:
压测并发数 | 关闭TPS | 开启TPS | TPS提升 | 关闭QPS | 开启QPS | QPS提升 | 关闭平均延迟(ms) | 开启平均延迟(ms) | 延迟降低 | 关闭tp99(ms) | 开启tp99(ms) | tp99降低 |
32 | 1,777 | 2,238 | 25.9% | 35,544 | 44,758 | 25.9% | 18.00 | 14.30 | 20.6% | 70.55 | 70.55 | 持平 |
64 | 1,156 | 2,341 | 102.5% | 23,122 | 46,814 | 102.5% | 27.68 | 13.67 | 50.6% | 82.96 | 75.82 | 8.6% |
128 | 753 | 2,366 | 214.3% | 15,060 | 47,321 | 214.3% | 42.49 | 13.52 | 68.2% | 92.42 | 75.82 | 18.0% |
256 | 425 | 2,388 | 461.6% | 8,508 | 47,761 | 461.6% | 75.21 | 13.40 | 82.2% | 167.44 | 74.46 | 55.5% |
512 | 231 | 2,330 | 909.5% | 4,612 | 46,594 | 909.5% | 138.77 | 13.73 | 90.1% | 267.41 | 77.19 | 71.1% |

图9:带量压测功能性能对比(开启LOW_PRIO后用户流量TPS保持稳定,512并发下提升9~11倍)
▶︎ 测试结论:
•压测并发越高,用户流量TPS提升幅度和延迟降低幅度越显著
•512并发压测场景下,用户流量TPS提升高达911倍,平均延迟降低90%,tp99延迟降低66~71%
•开启功能后,无论压测流量多大,用户流量TPS和延迟始终保持稳定
▶︎ 最佳实践:
•压测时为所有压测SQL添加/*+ DONGSQL_LOW_PRIO */ Hint
•需开启线程池功能(thread_handling=pool-of-threads)
•功能默认开启,无需额外配置
10、其他重要优化
10.1 监控表增强
▶︎ 新增监控表:performance_schema.dongsql_statement_summary
▶︎ 采集指标:SQL执行全链路的各项性能指标,包括解析时间、优化时间、执行时间、锁等待时间等。
▶︎ 门控参数:dongsql_query_time,支持通过门控参数控制是否写入监控数据。
-- 查看SQL执行全链路指标 SELECT * FROM performance_schema.dongsql_statement_summary WHERE digest_text LIKE '%orders%' ORDER BY timer_wait DESC LIMIT 10; -- 设置门控参数 SET GLOBAL dongsql_query_time = 0.1; -- 只记录执行时间超过100ms的SQL
10.2 Jemalloc Profiling
▶︎ 功能描述:支持jemalloc性能分析功能,添加malloc_stats_print函数用于内存分析。
▶︎ 应用场景:内存泄漏排查、内存使用优化、性能调优。
10.3 fdatasync优化
▶︎ 技术方案:使用fdatasync替代fsync加速文件系统访问,减少不必要的元数据刷盘。
▶︎ 性能提升:sysbench write_only场景下提升5%,延迟降低5%。
11、性能基准测试汇总
11.1 新特性性能提升汇总
优化模块 | 测试场景 | 性能提升 |
组提交单播通知 | oltp_insert(高并发) | 150-200% |
组提交单播通知 | oltp_update_non_index(高并发) | 100-120% |
执行计划缓存 | select_random_points(高并发) | 71-206% |
海量表启动 | 100万张表 | 82% 启动时间缩短 |
单点查询优化 | 主键查询 | 5-23% QPS提升 |
单点查询优化 | 唯一索引查询 | 6-21% QPS提升 |
SIMD加速 | SQL摘要计算 | 3-6% 整体提升 |
热点行更新 | 128线程单行热点更新 | 818% TPS提升 |
带量压测 | 512并发压测(用户8并发) | 911% 用户TPS提升 |
fdatasync优化 | write_only场景 | 5% QPS提升 |
11.2 版本整体性能对比
▶︎ 测试环境:一主一从半同步架构,16C32G,sysbench 16张表每张100万行
DongSQL 8.0版本对比(V1.2.0 vs V1.1.2)
测试场景 | V1.1.2峰值QPS | V1.2.0峰值QPS | 性能提升 |
oltp_read_only | 222,380 (32线程) | 296,042 (32线程) | 33% |
oltp_write_only | 84,049 (80线程) | 136,000 (80线程) | 62% |
oltp_insert | 27,087 (128线程) | 81,491 (512线程) | 201% |
oltp_read_write | 135,735 (64线程) | 190,713 (64线程) | 41% |
oltp_point_select | 360,286 (32线程) | 493,177 (64线程) | 37% |
oltp_insert详细对比:
线程数 | V1.1.2 QPS | V1.2.0 QPS | 提升幅度 |
64 | 20,856 | 32,550 | 56% |
128 | 27,087 | 47,871 | 77% |
256 | 23,520 | 64,521 | 174% |
512 | 22,758 | 81,491 | 258% |
1024 | 24,115 | 80,624 | 234% |
DongSQL 5.7版本对比(V1.2.0 vs V1.1.4)
测试场景 | V1.1.4峰值QPS | V1.2.0峰值QPS | 性能提升 |
oltp_read_only | 185,663 (24线程) | 284,698 (32线程) | 53% |
oltp_write_only | 154,277 (512线程) | 186,829 (256线程) | 21% |
oltp_insert | 63,077 (1024线程) | 86,740 (2048线程) | 38% |
oltp_read_write | 153,763 (64线程) | 220,723 (64线程) | 44% |
oltp_point_select | 451,474 (64线程) | 537,579 (64线程) | 19% |
▶︎ 性能提升分析:
DongSQL V1.2.0相比V1.1.x版本,在所有测试场景均有显著提升:
•写入密集型场景受益于组提交单播通知和半同步复制优化,性能提升最为显著
•读取密集型场景受益于单点查询优化和SIMD加速
•混合读写场景综合各项优化,整体性能提升约40%

图10:版本性能提升汇总(V1.2.0相比V1.1.x版本各测试场景提升幅度)
注:1.2.0 版本基准性能测试基于常规sysbench场景,热点行优化及带量压测功能需结合特定hint实现,因此基准测试数据不包含这两个场景性能优化带来的性能提升
12、未来规划
1.持续性能优化:深入优化核心执行引擎,持续提升OLTP场景性能
2.智能运维增强:完善监控诊断能力,提供更丰富的性能分析工具
3.云原生演进:推进存算分离架构,打造高性能低成本云原生数据库
13、结语
从V1.1.0到V1.2.0,DongSQL在热点行更新优化、主从复制性能、执行计划缓存、带量压测支持、海量表启动、SIMD加速等多个维度实现了重大突破。这些优化不仅提升了系统性能,更重要的是为京东零售场景提供了更坚实的技术底座。
京东零售数据库团队始终以"业务价值驱动技术创新"为核心理念,持续深耕数据库内核技术。未来,我们将继续围绕电商场景的核心需求,打造更强大、更稳定、更高效的数据库产品。






