传统库分表麻烦查询慢?TDengine 如何解决“搜狐基金”的应用难题

简介: 搜狐基金团队使用的 MySQL 数据库在面对海量数据时存在能力瓶颈,在此背景下,其决定基于 TDengine 尝试一下全新的方案。

该项目需要实时展示国内基金的净值和收益(货币基金),在保证满足折线图展示的功能基础上,还需要加入统计排行、分页展示等功能,为用户提供最全面实时的查询服务。此前搜狐基金团队使用的 MySQL 数据库在面对海量数据时存在能力瓶颈,在此背景下,其决定基于 TDengine 尝试一下全新的方案。

选型背景

在使用 TDengine 之前,我们使用的是 MySQL 数据库。

由于所购买的数据源的基金数据都是混在一起的,包含来自国内的2万只基金,跨越几十年(从九几年至今)的数千万行较宽的数据,如果通过 MySQL 来存储这些数据,我们首先要把每个基金的数据分表,有一定程度的工作量,所以我们决定先全量保存这些数据在一张表中。

但这种大表会导致查询的性能非常低下,为了应对这一问题,我们通过离线查询生成每天的基金数据图片返回给用户,暂未对外提供自定义查询服务。

与此同时,经历了以上种种,我们也在怀疑传统关系型数据库面对海量数据的能力瓶颈。这时候,我们了解到了 TDengine ,它的核心是一款时序数据库(Time Series Database),它“一个设备一张表”的特殊设计,与我们正在做的“一个基金一张表”的分表工作不谋而合。因此我们决定基于 TDengine 尝试一下全新的方案。

使用经历

通过充分调研和测试后,我们发现:

由于“超级表”的存在,数据建模变得非常清晰,几乎所有查询都可以以“超级表”为核心用简单的 SQL 完成。

此外,由于“自动建表”这个特色功能,我们可以无需校验就能够直接建表,这让我们得以非常轻松地完成各只基金数据的拆分建表以及写入工作。

可以说,接入 TDengine 的前期准备工作十分顺利。

我们使用三台 4C 16GB 的服务器组建了 TDengine 的集群。

数据库创建语句如下:

值得一提的是,基金数据是一日一条,属于低频次数据。对于这种数据,默认的配置是不够的。一开始我们的查询性能并不快,基本都是在秒级别甚至还有更高。

通过文档和博客以及官方团队的支持,我们放大了 duration 和 stt_trigger 参数,这样确保了不会产生过多的文件碎片影响读写性能,后续的查询全部被优化至毫秒级别。

因此我们总结出来一点经验就是:不同的写入频率属于不同的业务场景,最好不要使用同一个库,而是要分库处理比较好。

超级表建模如下:

当前在日常使用时,业务查询在 100 qps 的情况下,均可以实现毫秒级实时返回数据。

从超级表的设计特点出发,我们在超级表维度上做统计分析就方便多了,比如:筛选类型和日期的全量基金查询——

select time, code, name, manager_id, manager_name, unit_net_value, pre_unit_net_value, accumulate_net_value, pre_day_rate, pre_week_rate, pre_month_rate, pre_three_month_rate, pre_half_year_rate, pre_year_rate, pre_cur_year_rate, pre_start_rate, last_time, last_unit_net_value, last_accumulate_net_value, asset_size from fund_net_value where time =#{date} and (type = '003009' or type = '003010')

又比如,查询目前基金净值排行和收益排行,通过简单的 SQL 即可实现——

select time, code, name, manager_id, manager_name, unit_net_value, pre_unit_net_value, accumulate_net_value, pre_day_rate, pre_week_rate, pre_month_rate, pre_three_month_rate, pre_half_year_rate, pre_year_rate, pre_cur_year_rate, pre_start_rate, last_time, last_unit_net_value, last_accumulate_net_value, asset_size from fund_net_value where time =#{date} and order by ${column} ${sort} limit #{offset}, #{size}

与此同时我们搭建了 Grafana 可视化监控体系,利用各种监控工具和软件来收集、存储和分析监控数据,并通过可视化界面提供实时的监控图表和警报,帮助项目相关负责人即时识别修改问题,进一步提高了服务的可靠性和稳定性。

写在最后

总而言之,在保证稳定高效运行的前提下,我们已经通过 TDengine 逐步平滑替代原有功能。考虑到国内基金项目只是一个开始,围绕着股票等其他项目,我们仍需要对这款国产时序库做更多的研究与学习。

企业简介

搜狐公司是中国著名的的综合性互联网企业,主要业务领域包括新媒体、通信以及移动增值服务,集成了娱乐中心、体育中心、时尚文化中心等多重角色。

作者介绍

武朋,搜狐智能平台高级开发工程师。

目录
相关文章
|
Java Maven
Gradle下载安装教程
gradle和maven一样都是用来构建java程序的,maven2004年开始兴起,gradle2012年开始诞生,既然已经有了maven这么成熟的构建工具为什么还有gradle的诞生呢,因为gradle有很多地方比maven做的更好,例如gradle采用groovy语言开发,语法更加简单,例如maven一个配置需要三行,而gradle只需要一行即可
3862 0
Gradle下载安装教程
|
7月前
|
人工智能 运维 API
企业统一接入多模型的5大价值与落地路径
企业AI落地初期重模型效果,进入业务阶段后,核心挑战转为“接得稳、换得动、管得住”。统一接入通过标准化适配、弹性切换、统一策略、可观测治理与协同规范,降低多模型复杂度,保障长期运营韧性——是AI从实验走向生产的关键基础设施。
286 0
|
8月前
|
定位技术 API 网络虚拟化
跨境物流风控实战:用IP查询识别虚假收货地址
去年黑五,某平台遭IP与收货地分离欺诈:东南亚IP伪装美国特拉华州地址,骗补后集体拒收,致数十万美元损失。此类异常订单物流失败率达35%,是正常的7倍。本文详解IP地理校验三层风控(国家/城市/ISP)、三类落地场景及多维协同方案,助平台在下单环节精准识别虚假地址,降低跨境物流损耗。
658 2
Windows10添加自定义右键菜单VS Code
本文介绍了如何在Windows 10中通过修改注册表,将VS Code添加到右键菜单,实现右键文件、文件夹或空白处时使用VS Code打开。方法同样适用于其他程序,如Sublime Text 3。
|
数据采集 机器学习/深度学习 数据可视化
Python量化交易:结合爬虫与TA-Lib技术指标分析
Python量化交易:结合爬虫与TA-Lib技术指标分析
|
存储 负载均衡 调度
从 FlashAttention 出发:八个值得关注的技术迭代方向
本内容探讨了 FlashAttention 的八大优化方向,涵盖分层归一化、动态分块、上下界筛除、等价 softmax 实现、KV-cache 压缩、异构精度布局、2.5D 并行及调度优化,旨在提升长序列处理效率与多卡协同能力。
604 7
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
监控 供应链 API
1688商品列表API全参数指南:从基础搜索到高级筛选
1688商品列表API是阿里巴巴B2B平台的核心接口,支持关键词搜索、高级筛选、排序与分页功能,适用于选品、价格监控等场景。数据规范、稳定高效,日均调用量大。提供Python示例代码,便于快速接入与扩展应用。
|
开发者 Python
【Python】已解决:(Python3中pip无法安装urllib报错问题) ERROR: Could not find a version that satisfies the requireme
【Python】已解决:(Python3中pip无法安装urllib报错问题) ERROR: Could not find a version that satisfies the requireme
1943 0
【Python】已解决:(Python3中pip无法安装urllib报错问题) ERROR: Could not find a version that satisfies the requireme
|
传感器 存储 Java
一起玩转树莓派(17)——BMP180数字压力传感器应用
BMP180是一款高级的温度气压传感器,通过测量的气压值也可以计算出当前海拔高度。其压力测量范围为300-1100hPa,对应的海拔高度为正9000m-负500m。工作电压在1.8V到3.6V之间。体积小,精度高,采用I2C接口,使用非常方便。BMP180传感器在GPS导航,天气检测,海拔测量和垂直方向速度检测等方面有广泛的应用。本实验,我们尝试使用树莓派的I2C接口来读取BMP180的温度和气压值,并进行海拔高度的计算。
18763 0