vivo 数据库降本实践:探索成本效益最优的数据库解决方案

vivo 自 2022 年开始调研、测试 OceanBase 至今,现已上线 17 个业务系统,涵盖日志类、分析类、交易类业务,实现了总资源节省 80%,开发、运维工作大幅简化。vivo 体系与流程 IT 部门数据库高级工程师廖光明在本文中,详细介绍了 OceanBase 应用现状、遇到的问题,以及 OceanBase 与 MySQL 在开发、运维架构的各项特性对比。

图片

vivo 是一家以智能终端和智慧服务为核心的科技公司,研发线涵盖 5G 通信、人工智能、工业设计、影像技术等。得益于 vivo 的智能制造网络(含品牌授权),截至目前,vivo 年生产能力近 2 亿台,向全球超过 60 个国家和地区的 5 亿用户提供优质产品和服务。

我所在的部门主要负责 MES、ERP、产销存等系统,比如线下门店购买系统、网上应用商城、App 端应用市场等。vivo 整体上使用的数据库种类繁多,约有 1000+ 主机,涉及 15 种数据库(见图 1),还有数据同步工具需要维护。此外,还有多区域多云的特性,包括东莞机房自建、海外使用阿里云、AWS RDS 数据库。

图片

图1 vivo 使用的数据库种类

我们使用数据库的方式也比较复杂,例如,在一个业务中同时使用 MySQL 主从和MySQL MGR,如果涉及读写分离,还要分别叠加 Proxy 使用,数据库的多种类和架构的复杂性给运维团队带来了较大压力。

此外,我们还面临资源利用率较低、机器数量多、部分系统资源扩展瓶颈等问题。

  • RDS  成本高,资源利用率低:最贵的 CPU 资源利用率较低,平均 CPU 利用率不足 5%,CPU 峰值的平均值也不到 20%;磁盘和 I/O 资源利用率也偏低。在 AWS 中,存储类型和 IOPS 有绑定关系,每个系统都按未来最大规格去分配资源,系统资源的峰值时间节点也不一样。

  • 数据库数量不断增多,资源和管理成本增加:业务微服务拆分越来越细,造成数据库实例不断增多,RDS 成本越来越高。

  • MySQL 数据库扩展性不足:MySQL 数据库的可扩展性有限,依赖于分库分表进行水平扩容,带来开发运维复杂度。

基于业务考虑,核心业务系统为分库分表架构,某些场景又避免不了跨库 JOIN 查询,运维复杂;基于成本考虑,不仅运维成本高,而且数据库成本也高。因此,我们开始探索是否有更优的数据库方案。       

图片

在选型时,我们调研了两款分布式数据库,最终选择引入OceanBase。从选型角度讲,我们看重几个方面:

  • 产品成熟度。OceanBase 在 2010 年面世,在阿里巴巴和蚂蚁经历了很多应用场景的考验,尤其是支付宝核心业务和“天猫双 11”,其产品成熟度已经得到验证。

  • 产品性能。我们对比了 OceanBase 和 MySQL 的并发性能表现(见图 2)。在 50 并发下,OceanBase 单主模式(指定主节点,仅主节点提供服务)优于多主模式(所有节点提供服务),不过,MySQL 的响应时间更短;在 50 并发以上,OceanBase 的响应更快;在复杂 SQL 场景下,OceanBase 全面优于 MySQL。

  • MySQL兼容度。我们同样看重产品和 MySQL的兼容度,经过测试发现 OceanBase 高度兼容 MySQL,支持应用系统平滑迁移,过程中未出现任何兼容性问题。尤其 OceanBase 4.2 版本基本兼容 MySQL 8.0 的语法,避免了用户改造成本。

  • 运维工具。DBA 非常关注运维配套工具是否完善,OceanBase 有完善的运维工具,如安装部署工具 OBD、集群管理平台 OCP、迁移服务 OMS 等。同时,OceanBase 支持 promethus、binlog 等 400 余种生态工具,可以兼容我们现有 Flink CDC+logproxy 的数据同步方式,

图片

图2 OceanBase和MySQL的Sysbench 压测情况( 三节点 32C 128G )

此外,相比 MySQL,OceanBase 拥有极高的压缩率,可以节省存储成本;原生分布式,可以更快地完成数据横向扩展和纵向平滑扩展,并且原生高可用。

对于部分功能如数据压缩率、性能、成本等,我们也进行了测试。

▷ 数据压缩与性能

我们基于在云上和线下都有分布的产销存业务观察 OceanBase 的压缩率和响应时间,通过捕捉 MySQL 全量日志,同时全路径回放 MySQL 和 OceanBase 数据库,比对其 SQL 执行效率。

在云上,我们开启 RDS SLS 审计日志,捕获 RDS 时间段内的业务负载,并投递至 OSS,通过 OMA 读取 OSS 审计日志,解析成 SQL 文件,并记录审计日志中的 RDS 内核执行时间,然后使用解析文件,按用户定义回放倍速,向 OceanBase 上发送回放流量,记录 RT 时间,并结合 SLS 中的 RDS 整理最终结果报告。

线下回放同样开启 RDS SLS 审计日志,捕获 RDS 时间段内的业务负载,并投递至 OSS,但仅使用 SLS 解析出的 SQL 内容,不使用 SLS 中的 RDS 时间记录。从生产环境备份恢复出临时 RDS 实例,供流量回放,然后线下部署 OMA,将 SQL 负载同时回放至 RDS 和 MySQL,并分别统计执行时间,生成最终报告。

从图三的测试结果可见,相较于源数据库(MySQL),OceanBase 的效率较有优势,数据存储方面,OceanBase 的压缩比能达到 5.7 倍至 15.3 倍。最重要的是业务系统中的 MySQL 语句迁移到 OceanBase 完全兼容,没有修改。

图片

图3 源数据库(MySQL)与OceanBase的数据压缩率对比

同时通过应用回放,统计执行较为频繁的 SQL 响应时间对比(前者 MySQL,后者 OceanBase,小于 1ms 记为 0ms),从图 4 可见,一半的业务 SQL 性能持平,大约在 1ms 左右;另一半的业务 SQL 有数十上百倍的提升。

图片

图4 MySQL 与 OceanBase 的响应时间对比

由于产销存的线下业务数据量较大,这也是我们引入 OceanBase 的直接诉求。

vivo 各省业务系统的数据量并不一致,比如广东省的业务量比较大,一个门店的业务系统,最大的数据库为 2TB,大省份会独立个库,小省份会共库,但是所有省份又有整合数据的需求。

此前,整个业务系统采用分库分表架构,在查询场景,通过将各库数据聚合起来,难以保证查询的实时性和准确性。经过对 OceanBase 的性能测试,我们可以将汇总库和全国十余个分库合并为一个独立的 OceanBase 库,满足原来的跨库查询需求,较好地满足业务需求。

▷ 降本经验

OceanBase 基于 LSM-Tree 架构的存储引擎和数据压缩比为企业降低存储与硬件成本提供了更多可能。从硬件方面考虑,OceanBase 的降本优势在于超卖,各系统错峰使用超分资源,不同租户之间的弹性可以分时复用,提升资源利用率。假设对应以下三个系统,高峰期使用的资源都需要 4C8G。如果使用 MySQL,需要为三个业务系统都分配 3 个 4C8G 规格的资源;如果使用 OceanBase,只需要分配三个 1C8G 的租户,余 3 个CPU 资源可以共享。另外,如果开启 OceanBase 的读写分离特性,CPU 资源还能进一步充分利用。

图片

图5 OceanBase 降本

图片

目前,我们已经上线了 17 个业务系统,包括日志类、分析类、交易类等。原有业务系统架构为分库分表,以每个省份数据量切分,大省份会独立个库,小省份会共库;另将需要汇总查询的数据通过 DTS 汇总在一起;总计主机台数为 20 台,数据约 4.5T。在上线 OceanBase 后,整合后的资源为 12C,20G 租户规格,并开启读写分离,数据约 600GB。将各分库汇总为一个 OceanBase 库后,总资源节省 80%,也不再需要汇总库,查询时的准确性和实时性也得到了保障。

图片

图6 上线OceanBase节省80%总资源

不过,在使用过程中,我们也遇到了一些问题。

其一,OceanBase 4.2 之前的版本中语句在有大字段的情况下,我们写场景执行计划选择不正确,应该走索引走了全表,研发反馈是成本评估模型未考虑大字段场景而导致的,该问题目前在 4.2 版本已解决。

表:t_log_record` (`inter_param` longtext outer_param` longtext ,create_time` timestamp NOT NULL)  索引列为 create_time
         select * from t_log_record WHERE create_time >= '2023-08-11 09:00:00’  and create_time <= '2023-08-11 23:59:59';

其二,备份时段采用适当错开,NAS 资源挂载采用官方推荐的参数,NAS 资源不够会有出现 hang 住情况。

其三,OCP 管理资源应用容器的问题,当集群管理较多时,应该对 OCP 容器进行扩容,避免出现 OCP 卡顿现象。

我们也发现了部分参数设置的问题,在此列举一下供大家参考。第一个问题是默认的自增序列,如果 OceanBase 设置成和 Oracle Sequence 类似的 Order 模式,并发度也会下降。第二个问题是参数自增列,如果大家比较关注自增值的情况,存在业务含义,可以尽量把该值设小一点,避免某些场景下存在跳号情况,沿用默认参数会跳的比较大。

另外,查询参数默认只有10s,如果不调大,遇到某些场景容易超时,典型场景如创建索引。

图片

我们在使用 OceanBase 过程中开启了读写分离,能更加充分的利用机器资源。之所以不采用多主写模式,是因为 OceanBase 多主的模式在并发度较低的场景下,响应时间和 TPS 不及 MySQL ,在公有云也默认推荐单主的模式。

目前,我们接触 OceanBase 已有半年,从整体的测试和体验来看,符合预期。

图片

基于目前对 OceanBase 和 MySQL 的了解与应用经验,我总结了OceanBase对比MySQL 的优势和不足,供大家参考。

图片

  • 兼容性:从 MySQL 5.7 版本迁移至 OceanBase 无需修改代码,不过目前OceanBase 4.0 版本不支持逆序索引。

  • 在线 DDL :尽管 MySQL 5.7 是弱支持,但不得不说这是 MySQL 的一个痛点,需要借助扩展工具,而 OceanBase 可以支持几乎所有常用的功能,除了在线分区表模式。

  • 高可用和读写分离:MySQL 需要借助第三方工具来实现高可用、读写分离和审计,OceanBase 原生支持。

  • 执行计划固定:众所周知在 Oracle 里面机器是正常用的,但 MySQL 里面没有,支持 Query write 改写,但不容易管控,而支持 OceanBase 支持 Outline 固定。

  • 全局索引:MySQL 虽然有分区表,但不支持全局索引。但是有些场景其实避免不了使用全局索引,这方面 OceanBase 也是完全支持的。

  • 序列:我们在一些日志场景下,有时希望日志能够保存是哪个月,MySQL 没有序列特性,还需要写脚本,带来高水位的问题。OceanBase 对序列的支持避免了此类问题的发生。

  • TTL 特性:MySQL 不支持,OceanBase 4.2 版本开始支持。

  • 大事务支持:MySQL 容易引起主从延时,如果用 Mgr,一旦事务大就容易有流控剔除节点。我们在数据迁移场景下,发现即使是 TB 级别的数据,OceanBase 也毫无压力。

  • hash join:MySQL 8.0 支持,但比较弱;OceanBase 支持。

  • 并行:MySQL 不支持,这也是慢的原因之一;OceanBase 支持并行,而且在查询优化不动的情况下,如果 CPU 足够,还可以用蛮力。

  • 死锁:MySQL 不支持死锁检测视图,如果遇到死锁,只能去后台翻日志;OceanBase 有死锁检测视图查询。

  • DBLink:MySQL 虽然号称有第三方组件,但基本没人这么用;OceanBase 4.2 开始支持。

  • SQL限流:其实 OceanBase 是可以通过去加 hint 并发来限制 SQL 的并发度。而用 MySQL 或 Oracle 都没有特别好的方式对 SQL 的流量做限制。OceanBase 在不停应用的情况下,还有自动限制慢 SQL 的能力,超过默认 10s 的话,只会给慢 SQL 默认 30% 的资源使用,防止一个慢 SQL 拖垮整个系统。

  • 数据压缩比:MySQL 的数据压缩依赖于操作系统文件系统,相较之下,OceanBase 的数据压缩比是 MySQL 的 6~7 倍。

  • 内存回收:如果我们用 MySQL 的话,经常在使用过程中会发现内存使用的百分比较高,但是这块内存如果想要去回收的话,并不是很好办,因为看内存占用比并不知道 MySQL 实际需要占用多少内存。但 OceanBase 会定期回收合并,释放内存,更容易监控数据库所需实际内存。

  • 碎片:使用 MySQL 的时候频繁 DML 容易有碎片,由于 OceanBase 使用 LSM  架构,会定期合并,不容易有碎片。

  • 备份恢复(闪回查询):MySQL 不支持,依赖 binlog ,OceanBase 支持表级闪回查询,租户级闪回操作,可以同一份数据进行多次测试。

  • 规格变更:使用 MySQL 的时候云 RDS 在资源规格扩容时,应用会有闪断;OceanBase 租户规格变更没有闪断。

  • 版本升级、变更:MySQL 无官方工具,需要自行开发,这对于升级工作量较大的部门非常不友好,OceanBase 提供了原生的升级工具,比较顺畅。

另外,生态工具对 DBA 而言是减负和提效的利器,MySQL 依赖自行开发,OceanBase 有 ODC、OCP、OMS 等自行开发的工具,可以支持开发自助 SQL 审核、数据执行、数据归档、数据删除、DDL 等常规繁锁危险的操作,可以协助 DBA 完成监控构建、高可用演练、定位问题、备份恢复、规格扩容、语句审核与执行,以及数据的导入、导出、迁移、同步、清理等。目前,我们通过 OceanBase 工具的 WEB 界面基本可以完成相关运维工作,其有细粒度权限管控,可以开放相关权限与相关人员自助,进一步简化了 DBA 的重复工作。OceanBase 还与 400+ 上下游生态工具进行了兼容和集成,对用户来说也很方便。

同时,我也总结了在使用 OceanBase 的工具时,需要注意的事项,以及我们希望优化的细节。

▷ 首先在功能性方面:

  • OCP 上升级 OceanBase 版本时不允许租户有多个 primary_zone 存在,升级时如果租户多,切换主节点会比较繁琐。目前 4.2 版本已经支持。

  • 如果用户手动改了集群的 root 密码或者租户的 root 密码时(不通过 OCP 平台),密码没法重置,这个如果有人故意使坏,比较危险。(OceanBase 计划 4.2.3 版本支持)

  • OCP 查看执行计划时,只有已知索引列统计信息,没有其他列统计信息,希望能补充下相关 where 条件列后的列统计信息。比如 create_time 列区分度不佳,但我想知道 time_cost 列是否适合建索引。(官方告知 obdiag 工具支持该功能)

  • CPU 内存能隔离时能支持最小、最大范围,保证最小资源,很多场景都是用户初始化时资源要多,其他时候资源比较闲。(OCP 4.3 计划支持)

  • OBProxy 读写节点支持权重配置,防止负载不均衡。

  • OceanBase 支持类似 Oracle Intervel 分区特性。当前可以通过 ODC 工具进行支持,但更希望数据库内核原生支持,OceanBase 计划在明年的内核 4.4 版本支持该功能。

  • OMS 管理平台支持第三方登录,角色映射。

▷ 其次在易用性方面:

        

  • OCP 平台上,如果是脚本创建的租户,OCP 控制台登陆时需要手动输入密码;然后如果切换 OCP 用户又要再输入一次密码。(OCP 4.2.2 密码箱易用性改进)

  • OCP 租户界面能有用户说明,这样便于用户侧知道自己名下系统。(OCP 4.2.2 支持标签管理)

  • OMS 添加数据源,在输入 OceanBase 连接串时,能根据 OCP 选择相关信息,减少输入工作量。

图片

此次数据库的选型与替换历经半年,最终取得了不错的效果,主要体现为:OceanBase 与 MySQL 高度兼容,迁移时无需修改代码;MySQL 分库分表架构替换为OceanBase后,总资源占用节省了 80%,也极大地降低了运维成本;OceanBase 的运维工具和社区支持帮助 DBA 简化了运维复杂度,减轻了运维负担。

vivo 对应用 OceanBase 的计划分为三步。

第一步,试点运行。以 OceanBase 社区版替代 MySQL 为起点,优先选择存在分库分表痛点或资源占用成本高的业务,作为迁移到 OceanBase 的试点。将功能模块以影响度从低到高的顺序改造或迁移上线,过程中开发、DBA 或相关团队同步建设 OceanBase 的技术能力。

第二步,业务扩散并规模化改造。传统数据库架构向 OceanBase 数据库架构改造,同时,结合 OceanBase 的特性,选择适用且有改造价值的业务改造,将 OceanBase 作为 MySQL 能力不足场景的补充,依然保留 MySQL 适用场景。

第三步,规模化改造并全面保障业务。将 OceanBase 技术能力在 IT 建设成熟,并落地于更多 vivo 的业务场景,同时进行成本优化、降本增效,以及建设灾备环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/130712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Antd G6实现自定义工具栏

在使用g6实现知识图谱可视化中&#xff0c;产品经理提出了有关图谱操作的不少功能&#xff0c;需要放置在工具栏中&#xff0c;其中有些功能不在g6自带的功能里&#xff0c;且工具栏样式、交互效果也和官方自定义工具栏不同。那我们怎么去实现呢&#xff1f; g6官方的工具栏案例…

香港和美国节点服务器的测试IP哪里有?

在选择服务器时&#xff0c;我们通常需要进行一些测试来评估其性能和稳定性。当然&#xff0c;这其中一个重要的测试指标就是服务器的 IP 地址。通过测试 IP 地址&#xff0c;我们可以了解到服务器所在地区以及网络连接质量等信息。作为香港及亚太数据中心领先服务商恒创科技&a…

解决Python并发访问共享资源引起的竞态条件、死锁、饥饿问题的策略

目录 一、概述 二、竞态条件 三、死锁 四、饥饿 五、总结 一、概述 在Python中&#xff0c;多线程和多进程可以有效地提高程序的并发性能。然而&#xff0c;当多个线程或进程需要访问共享资源时&#xff0c;可能会引发竞态条件、死锁和饥饿等问题。这些问题可能会导致程序…

敏捷战略实施方法-资深组织发展专家实践秘笈

要怎样才能生成敏捷战略呢&#xff1f;作者基于多年的组织发展实践&#xff0c;总结出如下公式&#xff1a;敏捷战略 战略共创 迭代进化 即要得到一个好的敏捷战略&#xff0c;首先要做好战略共创&#xff0c;并在战略实施过程中对战略进行持续迭代&#xff0c;两者不可偏废…

机器学习——奇异值分解案例(图片压缩-代码简洁版)

本想大迈步进入前馈神经网络 但是…唉…瞅了几眼&#xff0c;头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作&#xff0c;会有一种浮在云端的虚无感 但是如果要实际操作&#xff0c;我又不想直接调用库包 可是…如果不直接调包&#xff0c;感…

一种优雅的调用第三方接口的思路及实现

之前的项目调用第三方接口时&#xff0c;往往用HttpUtils类似的静态方法调用。比较丑&#xff0c;不通用。如下&#xff0c;这是截取项目中某人调用的一段代码&#xff0c;非常不雅&#xff1a; 经改进后&#xff0c;采用了动态代理技术来实现&#xff0c;效果如下&#xff1a…

RabbitMQ的 五种工作模型

RabbitMQ 其实一共有六种工作模式&#xff1a; 简单模式&#xff08;Simple&#xff09;、工作队列模式&#xff08;Work Queue&#xff09;、 发布订阅模式&#xff08;Publish/Subscribe&#xff09;、路由模式&#xff08;Routing&#xff09;、通配符模式&#xff08;Topi…

网络安全-黑客技术-小白学习

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

VScode + opencv(cmake编译) + c++ + win配置教程

1、下载opencv 2、下载CMake 3、下载MinGW 放到一个文件夹中 并解压另外两个文件 4、cmake编译opencv 新建文件夹mingw-build 双击cmake-gui 程序会开始自动生成Makefiles等文件配置&#xff0c;需要耐心等待一段时间。 简单总结下&#xff1a;finish->configuring …

【图论实战】 Boost学习 03:dijkstra_shortest_paths

文章目录 示例代码 示例 最短路径: A -> C -> D -> F -> E -> G 长度 16 代码 #include <iostream> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/dijkstra_shortest_paths.hpp> #include <boost/graph/graphviz.h…

状态机实现RGB灯跳变

1.项目功能梗概 因为原本使用的为for循环进行遍历&#xff0c;然后依次执行代码&#xff0c;但是由于看门狗的存在&#xff0c;不能使用delay_ms这种死延时。所以现在打算定时器回调函数控制状态机状态这种方法。 2.状态机 作用 当系统需要执行某个任务时&#xff0c;可以根据…

力扣字符串--总结篇

前言 字符串学了三天&#xff0c;七道题。初窥kmp&#xff0c;已经感受到算法的博大精深了。 内容 对字符串的操作可以归结为以下几类&#xff1a; 字符串的比较、连接操作&#xff08;不同编程语言实现方式有所不同&#xff09;&#xff1b; 涉及子串的操作&#xff0c;比…

Python数据结构: 列表(List)详解

在Python中&#xff0c;列表&#xff08;List&#xff09;是一种有序、可变的数据类型&#xff0c;被广泛用于存储和处理多个元素。列表是一种容器&#xff0c;可以包含任意数据类型的元素&#xff0c;包括数字、字符串、列表、字典等。本文将深入讨论列表的各个方面&#xff0…

strcat()用法

描述 头文件&#xff1a;<string.h>char *strcat&#xff08;char *dest&#xff0c; const char *src&#xff09;功能&#xff1a;将src字符串加到dest上&#xff0c;并返回指向dest字符串的指针。 举例 #include<stdio.h> #include<string.h> int mai…

基恩士软件的基本操作(一)

今天就来学习基恩士软件的基础操作&#xff0c;欢迎大家的指正&#xff01;&#xff01;&#xff01; 基本操作 KV STUDIO 基恩士编程软件的名称就KV STUDIO。安装软件地址KV STUDIO的安装与实践 项目的创建 1&#xff0c;双击KV STUDIO. 2&#xff0c;新建项目 单元编辑器…

【MATLAB源码-第74期】基于matlab的OFDM-IM索引调制系统不同频偏误码率对比,对比OFDM系统。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM-IM索引调制技术是一种新型的无线通信技术&#xff0c;它将正交频分复用&#xff08;OFDM&#xff09;和索引调制&#xff08;IM&#xff09;相结合&#xff0c;以提高频谱效率和系统容量。OFDM-IM索引调制技术的基本思想…

【docker:容器提交成镜像】

容器创建部分请看&#xff1a;点击此处查看我的另一篇文章 容器提交为镜像 docker commit -a "sinwa lee" -m "首页变化" mynginx lxhnginx:1.0docker run -d -p 88:80 --name lxhnginx lxhnginx:1.0为啥没有变啊&#xff0c;首页&#xff1f; 镜像打包 …

SMART PLC模拟量上下限报警功能块(梯形图代码)

博途PLC模拟量偏差报警功能块请参考下面的文章链接: 模拟量偏差报警功能块(SCL代码)_RXXW_Dor的博客-CSDN博客文章浏览阅读594次。工业模拟量采集的相关基础知识,可以查看专栏的系列文章,这里不再赘述,常用链接如下:PLC模拟量采集算法数学基础(线性传感器)_plc傳感器數…

ElasticSearch7.x - HTTP 操作 - 文档操作

创建文档(添加数据) 索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数 据库中的表数据,添加的数据格式为 JSON 格式 向 ES 服务器发 POST 请求 :http://192.168.254.101:9200/shopping/_doc 请求体内容为: {"title":"小…

多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测

多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测 目录 多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时…