从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践
本文分享自华为云社区《DTSE Tech Talk × openGemini :从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践》,作者:华为云开源。
在本期《从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践》的主题直播中,华为云开源DTSE技术布道师&openGemini社区发起人Shawn,通过解析数据库应用开发的一般流程与开发者们分享了熟悉业务场景是做好数据库设计的关键这一重要观点,并分别向大家介绍了openGemini库和表设计、数据写入、数据查询的最佳实践,希望能让开发者们从优秀实践中获得新的启发和提升。
熟悉业务场景是做好数据库设计的关键
任何数据库都不是万能的,熟悉业务场景是做好数据库设计非常关键的一环,同时,当了解清楚业务场景再去做数据库选型时会给你带来很大的帮助。做数据库选型之前,大家可以按照以下8条去做细致的评估:
- 数据分类
- 应用分类
- 采集频率(s)
- 时间线评估
- 每分钟写入数据量
- 采集的指标
- 业务查询场景
- 数据保留周期

openGemini库和表设计最佳实践
当把业务场景都了解清楚过后,便可以做库和表的设计了。Shard是openGemini的数据分片概念,openGemini支持shard延时加载,也就有了有活动shard和历史shard的区别。每个shard有自己的索引和缓存,增加DB,或者增加RP,都会增加同等数量的shard,也就增大了数据处理的并发度。个人建议在使用openGemini时采用多个库,适度增加DB数量,有利于系统资源得到充分利用,并提升性能。
当机器规格一定时,支持的shard数量是有上限的
粗略的评估方法:shard数量 <= 总量内存 * 0.25 / 60M
Shard数量受本地磁盘性能限制,因为不同shard之间存在磁盘带宽和I/O的竞争。

shard或表过多,容易对系统性能造成影响:
- DB/RP越多,shard越多,占用内存资源会越大,磁盘I/O竞争越大
- 表越多,数据文件越多,占用操作系统句柄资源越多
- Shard和表越多,元数据越多,ts-sql和ts-store与ts-meta之间同步元数据时延大,会造成数据读写性能波动
表的设计原则:
- 建表要结合查询场景做综合考虑
- 建表要充分考虑指标列数量,大于1000列,建议开始分表
openGemini数据写入最佳实践
现在跟大家分享一下客户端写数据最佳实践的注意事项:
- 客户端批量写入,减少网络交互
- 客户端并发写入,确保多批次数据之间时间线不存在交叉,减少乱序数据的产生
- BatchSize指一次批量写入的数据大小,需多次实验,找到最为合适的值
- ts-sql并发分发数据能力是一定的,增加sql数量才能处理更多数据
- 写入并发比较大的情况下,可以适当减小BatchSize,否则ts-store容易造成数据堆积
写性能的内核参数调优:正常情况下,业务的写QPS是趋于稳定的,当出现比较大的波动时,引起原因可能是:数据量增大导致wal时延增加、磁盘IO瓶颈、数据缓存堆积、Compaction阻塞等。
openGemini数据查询最佳实践
时间线比较多时(百万以上),如下查询场景要慎用,可能引发进程OOM:
- 全量时间线扫描,无TAG过滤
- 海量分组:TAG+Time | 细粒度Time
- 海量数据在ts-sql聚合场景(除first/last/count/sum/mean/min/max外)
- 海量时间线查询, tag1=xxx 可能对应百万时间线

openGemini 查询语句使用Tips:
1、查询返回的数据量比较多时,推荐添加查询参数:chunked=true&chunk_size=1000 ,可分批流式返回
例如:
curl -XPOST 'http://localhost:8086/query?db=mydb& chunked=true & chunk_size=1000 ' --data-urlencode 'q=SELECT * FROM mst'
2、在openGemini集群中,一条时间线数据只属于一个数据节点,因此在做简单查询时,可以使用Hint查询,直接定位到具体数据节点查询数据。
语法: /*+ full_series */
约束:查询条件必须包含所有的TAG
例如:
SELECT /*+ full_series */ mean(C) FROM mst WHERE A=“a1” AND B=“b1” AND time > xxx AND time < xxx
3、嵌套查询要遵循的原则:处在最里层的子查询尽可能通过TAG或者时间过滤数据,减少结果数据总量
例如:
SELECT * FROM
(SELECT temperature FROM disk_temp_monitor WHERE time > xxx AND time < xxx AND nd=“xxx” AND disk_type = SATA_HDD )
WHERE disk_type = SATA_HDD GROUP BY * LIMIT 1000
本次分享到这里就结束了,openGemini社区旨在打造开放、合作、包容的全球性技术社区,欢迎大家试用openGemini时序数据库,加入开源社区。
openGemini开源地址:https://github.com/openGemini
openGemini官网地址:https://opengemini.org

openGemini是一款开源分布式时序数据库,主要聚焦于海量时序数据的存储和分析,通过技术创新,简化业务系统架构,降低存储成本,提升时序数据的存储和分析效率。
HDC 2024,6月21日-23日,东莞松山湖,期待与您相见!
更多详情请参见大会官网:
中文:https://developer.huawei.com/home/hdc
英文:https://developer.huawei.com/home/en/hdc
从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践的更多相关文章
- 【性能调优】:记录一次数据库sql语句性能调优过程
一,依旧很简单的一个接口,查询列表接口,发现10并发单交易场景下,数据库表4w铺底数据,每次查询2000条数据进行orderby显示,平均响应时间2秒以上,数据库的cpu使用率高达95%: 二,抓到这 ...
- linux性能调优概述
- 什么是性能调优?(what) - 为什么需要性能调优?(why) - 什么时候需要性能调优?(when) - 什么地方需要性能调优?(where) - 什么人来进行性能调优?(who) - 怎么样 ...
- Redis基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- Redis 基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- 程序员必须掌握的性能调优 X Y Z
热评博文:<如何设计出优美的Web API?>,现阅读量超 2500,小伙伴们不要错过哦! 2003 ~ 2008 年,这五年老兵哥我在通信行业做实习生和开发岗,主要用 C / C++ / ...
- EBS的性能调优
metalink Tuning performance on eBusiness suite (Doc ID 744143.1) 这篇文档描述了如何调查电子商务套件的整体性能下降. ...
- Apache Pulsar 在 BIGO 的性能调优实战(上)
背景 在人工智能技术的支持下,BIGO 基于视频的产品和服务受到广泛欢迎,在 150 多个国家/地区拥有用户,其中包括 Bigo Live(直播)和 Likee(短视频).Bigo Live 在 15 ...
- MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化
第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化, ...
- MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化
第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就 ...
- MySQL性能调优与架构设计——第8章 MySQL数据库Query的优化
第8章 MySQL数据库Query的优化 前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 ...
随机推荐
- CTFshow命令执行29-123
命令执行 WEB29 eval是php中执行以PHP脚本执行的命令 PHP命令可以执行脚本命令 本题使用方法是先 system(cp f*.php 1.txt) 然后访问1.txt WEB30 在PH ...
- 高云SOC芯片GW1NSR-LV4CQN48的ARM总线
高云SOC芯片GW1NSR-LV4CQN48的ARM总线 国产GOWIN高云出的一款芯片是GW1NSR-LV4CQN48PC7/I6,QN48封装,资源是4608,有10个18K BRAM,以及2个P ...
- javascript:eval()的用法
eval() 是 JavaScript 中的一个全局函数,它可以计算或执行参数.如果参数是表达式,则 eval() 计算表达式:如果参数是一个或多个 JavaScript 语句,则 eval() 执行 ...
- 一站式指南:ClkLog部署环境配置指南
在今天的数字化世界中,数据管理和分析工具的选择对于企业的成功至关重要.ClkLog作为一款强大的日志分析工具,能够帮助企业从海量数据中洞察业务.提升效率.然而,如何才能顺利部署ClkLog系统,使其最 ...
- 力扣26(java&python)-删除有序数组中的重复项(简单)
题目: 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度.元素的 相对顺序 应该保持 一致 . 由于在某些语言中不能改变数组的长 ...
- [Go] go build 和 go install 的区别
$ go build 源文件及其包依赖 编译成二进制. install 不仅执行build过程 而且会把编译的二进制放到 $GOPATH/bin/,包放到 $GOPATH/pkg/ Link:http ...
- Raft 共识算法4-选举限制
Raft 共识算法4-选举限制 Raft算法中译版地址:https://object.redisant.com/doc/raft中译版-2023年4月23日.pdf 英原论文地址:https://ra ...
- 2.docker-compose安装prometheus
一.docker-compose安装 前期准备 # docker配置文件 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json < ...
- Rancher管理K8s集群(14)
一.Rancher介绍 1.1 Rancher简介 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,实现了 Kubernetes 集群在混合云+本地 数据中心的集中部署与管理 ...
- js原型,原型链(不断补充中)
1.如何使用构造器? function Person(name, age) { this.name = name; this.age = age; } var man = new Person(&qu ...