当前位置: 首页 > article >正文

golang 高性能的 MySQL 数据导出

    • 需求
    • 导出方式对比
        • 方案1:快照导出(耗时:1.5s)
        • 方案2: 偏移分页(耗时:4s)
        • 方案 3:普通分页(耗时:4min40s)

需求

  • 导出 MySQL 数据

分析:

  • 一次性 select 大量数据带来的问题

性能问题:

数据库负载:大量数据查询会增加数据库的CPU、内存和I/O负担,可能影响其他操作。

网络传输:大数据量传输会占用大量带宽,导致网络延迟或超时。

内存消耗:

服务器内存: 消耗太大,影响其他业务运行

导出方式对比

  • 条件:
  • 200 万数据
  • 查询全表耗时 3s
方案1:快照导出(耗时:1.5s)
data, err := db.Query("select * from user2")
	if err != nil {
		log.Fatal("err1:", err)
	}
	defer data.Close()

	columns, err := data.Columns()
	if err != nil {
		log.Printf("[error] %v \n", err)
	}

	l := len(columns)

	val := &User{}
	valPointer := make([]interface{}, l)
	valPointer[0] = &val.Id
	valPointer[1] = &val.Name
	valPointer[2] = &val.Tag
	valPointer[3] = &val.Phone
	valPointer[4] = &val.Create_time

	//计数
	num := 0

	for data.Next() {
		err := data.Scan(valPointer...)
		if err != nil {
			log.Fatal("err5:", err)
		}
	}
方案2: 偏移分页(耗时:4s)
	// 定义分页参数
	starId := 0
	pageSize := 2000
	// 定义查询条件
	var users []User
	// 执行分页查询
	for {
		result := db.Limit(pageSize).Where("id >= ?", starId).Find(&users)
		if result.Error != nil {
			log.Fatal("err5:", result.Error)
		}

		if len(users) < pageSize {
			break
		}
		starId = users[len(users)-1].Id
	}
方案 3:普通分页(耗时:4min40s)
// 定义分页参数
	page := 1
	pageSize := 2000

	// 导出数据
	for {
		var users []User
		result := db.Offset((page - 1) * pageSize).Limit(pageSize).Find(&users)
		if result.Error != nil {
			log.Fatal("err5:", result.Error)
		}
		if len(users) < pageSize {
			break
		}
		page++
	}

http://www.kler.cn/a/581662.html

相关文章:

  • [算法] 结点K个一组的链表反转(hard)
  • Spring Cloud Alibaba 实战:Sentinel 保障微服务的高可用性与流量防护
  • Trae AI 辅助修复uniapp 微信小程序的Bug
  • Flink之SQL join
  • datax-coud部署
  • docker2
  • Git基本概念及使用
  • 前端开发中的设计模式:观察者模式的应用与实践
  • 《基于深度学习的本科论文撰写智能校验助手》开题报告
  • 主流编程语言的对比分析
  • 【10】单片机编程核心技巧:指令周期与晶振频率
  • 【OpenCV图像处理基础与OCR应用】
  • C# 检查系统是否开启 Hyper - V
  • Java中,BIO、NIO和AIO三种模型的区别和适用场景
  • OLED屏幕开发全解析:从硬件设计到物联网显示实战 | 零基础入门STM32第五十二步
  • 26.Harmonyos Next仿uv-ui 组件NumberBox 步进器组件小数位数设置
  • harmonyOS(鸿蒙)— 网络权限(解决app网络资源无法加载,图片无法显示)
  • STM32学习【5】底层的知识使用_汇编_反汇编_机器码
  • Python第十七课:卷积神经网络 | 计算机视觉之眼
  • Unknown collation: ‘utf8mb4_0900_ai_ci‘