不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • Python

  • GO

  • Java

  • 业务问题

    • 01.微博消息推送Feed流设计
    • 02.秒杀系统架构 ✅
    • 03.支持10万QPS的会员系统 ✅
    • 04.支付系统的设计 ✅
    • 05.即时通讯系统设计
    • 06.外卖系统设计
    • 07.打车系统设计
    • 09.内容分发网络CDN设计
    • 13.日志系统的设计
    • 14.百亿规模浏览记录
    • 15.十亿数据批量写入mysql
      • 01.十亿数据写入mysql
    • 16.区块链交易所
  • 关键技术

  • 项目常识

  • 计算机基础

  • 区块链

  • 常识
  • 业务问题
xiaonaiqiang
2024-02-07
目录

15.十亿数据批量写入mysql

# 01.十亿数据写入mysql

  • 无论多大规模的问题,本质就是拆解,把一个大的工程拆解到能够执行的小步骤即可

  • 这里核心问题主要有下面几个

  • 第一:把十亿数据分成50份,每个任务只需要处理2000万数据

    • 1.txt
    • 2.txt
    • …
    • 50.txt
  • 第二:如何提高mysql写入效率

    • 分库
    • 批量写入
  • 第三:是否并发写入同一张表并保证表插入顺序

    • 并发写入一张表无序,提高批量插入的阈值,在一定程度上增加了插入并发度
  • 第四:如何写入更合适

    • 我理解相对于磁盘IO和CPU而言,性能瓶颈更可能出现在mysql插入上
    • 所以没必要使用kafka或者多线程,一个线程批量读取,然后另外一个线程批量写入即可
    • 批量读取数据可以直接写到内存中,直接设置一个内存buffer(设置好buffer大小,避免内存溢出)
  • 第五:如何保证任务可靠

    • 如果读取任务进行到一半,宕机或者服务发布如何处理呢

    • 因为是保证顺序写入表中的,只需要借助redis的INCRBY方法来记录当前写到多少行即可

    • # 初始化键 task_offset_{taskId} 的值为 0 {taskId}是每个文件对应的线程任务标识
      SET task_offset_{taskId} 0
      # 将键值加1(也可以批量写入后批量增加)
      INCRBY task_offset_{taskId} 1
      
      1
      2
      3
      4
上次更新: 2025/2/19 16:42:39
14.百亿规模浏览记录
16.区块链交易所

← 14.百亿规模浏览记录 16.区块链交易所→

最近更新
01
300.整体设计
06-10
02
06.LangGraph
06-09
03
202.AI销售智能体
06-07
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式