Golang Go语言中的优化问题
目前有一张交易表 100w 数据 和用户提成表( 100w+数据),和用户表( 3 千条数据), 目前需求是每个用户生成当月报表 csv , 交易表和分润表已经按月分表。
我的处理逻辑就是 ,查询出 3k 条用户,然后循环进行查询交易表和提成表数据生成 csv 上传 oss 然后保存数据到一张新的报表记录表中,
这样就有个问题 ,io 太大了。 循环 3k 条用户数据 每查询一个用户都要 查询交易表和用户提成表, 有没有什么优化思路。除了 mysql 数据库索引之外
Golang Go语言中的优化问题
更多关于Golang Go语言中的优化问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
换个思路,比如把这些需要联表 分组查询的 直接以一条记录的形式存在一个新的报表表中,这样子是不是会好点儿?
更多关于Golang Go语言中的优化问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
物化视图
可以 1 次 select 直接出来结果的。指条明路,你自己研究一下:JSON_ARRAYAGG(JSON_OBJECT(…))
加几个限定:
1. 生成报表只需要离线。
2. 用户表基本固定 3k+,交易和提成按月分表,每个月的数据量 100w+
在这基础上,我的建议是:
找一个单独的机器,这个机器提供 4G 左右的内存,
写一个 python 脚本,用 select * from xxx limit a, b 的方式,将用户表和交易表全部 load 到内存。
然后手动实现 join 和统计之类的工作,之后写结果到 csv 。
针对Golang(Go语言)中的优化问题,可以从以下几个方面进行考虑:
-
内存管理:
- 使用对象池(如sync.Pool)来重用对象,减少内存分配和垃圾回收的负担。
- 避免内存泄漏,及时释放不再使用的对象,并定期检查内存使用情况。
-
数据类型选择:
- 优先使用原生类型和值类型(如整型、浮点型、结构体、数组等),这些类型在性能上通常优于引用类型。
- 根据实际需求选择合适的数据结构,如使用切片代替数组,使用map代替链表等。
-
并发性能:
- 充分利用Go语言的并发特性,使用goroutine和channel来处理并发任务。
- 根据系统资源调整GOMAXPROCS的值,以优化并发性能。但需注意,过高的GOMAXPROCS值可能会导致性能下降。
-
I/O操作优化:
- 使用bufio包提供的缓存机制来缓冲I/O操作,减少系统调用次数。
- 对于文件操作,可以使用os.File的ReadAtLeast和ReadFull方法来确保读取或写入至少指定数量的字节。
-
垃圾回收调优:
- 通过调整GOGC环境变量来控制垃圾回收的频率,以适应不同的应用场景。
- 监控垃圾回收的性能,并根据实际情况调整参数以获得最佳效果。
综上所述,Golang的优化需要从多个方面综合考虑,并结合具体的应用场景和需求来选择合适的优化策略。