iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL单表千万级数据处理的思路分享
  • 701
分享到

MySQL单表千万级数据处理的思路分享

MySQL单表数据处理MySQL千万级数据处理 2022-05-20 17:05:46 701人浏览 薄情痞子
摘要

目录项目背景改进思路观察数据特征多进程处理思路总结数据处理技巧项目背景 在处理过程中,今天上午需要更新A字段,下午爬虫组完成了规格书或图片的爬取又需要更新图片和规格书字段,由于单表千万级深度翻页会导致处理速度越来越慢

目录
  • 项目背景
  • 改进思路
    • 观察数据特征
    • 多进程处理
  • 思路总结
    • 数据处理技巧

      项目背景

      在处理过程中,今天上午需要更新A字段,下午爬虫组完成了规格书或图片的爬取又需要更新图片和规格书字段,由于单表千万级深度翻页会导致处理速度越来越慢。

      
      select a,b,c from db.tb limit 10000 offset 9000000
      

      但是时间是有限的,是否有更好的方法去解决这种问题呢?

      改进思路

      是否有可以不需要深度翻页也可以进行数据更新的凭据?
      是的,利用自增id列

      观察数据特征

      此单表有自增id列且为主键,根据索引列查询数据和更新数据是最理想的途径。

      
      select a,b, c from db.tb where id=9999999;
      update db.tb set a=x where id=9999999;
      

      多进程处理

      每个进程处理一定id范围内的数据,这样既避免的深度翻页又可以同时多进程处理数据。
      提高数据查询速度的同时也提高了数据处理速度。
      下面是我编写的任务分配函数,供参考:

      
      def mission_handler(all_missions, worker_mission_size):
          """
          根据总任务数和每个worker的任务数计算出任务列表, 任务列表元素为(任务开始id, 任务结束id)。
          例: 总任务数100个,每个worker的任务数40, 那么任务列表为:[(1, 40), (41, 80), (81, 100)]
          :param all_missions: 总任务数
          :param worker_mission_size: 每个worker的最大任务数
          :return: [(start_id, end_id), (start_id, end_id), ...]
          """
          worker_mission_ids = []
          current_id = 0
          while current_id <= all_missions:
              start_id = all_missions if current_id + 1 >= all_missions else current_id + 1
              end_id = all_missions if current_id + worker_mission_size >= all_missions else current_id + worker_mission_size
              if start_id == end_id:
                  if worker_mission_ids[-1][1] == start_id:
                      break
              worker_mission_ids.append((start_id, end_id))
              current_id += worker_mission_size
      
          return worker_mission_ids
      

      假设单表id最大值为100, 然后我们希望每个进程处理20个id,那么任务列表将为:

      
      >>> mission_handler(100, 40)
      [(1, 40), (41, 80), (81, 100)]
      

      那么,
      进程1将只需要处理id between 1 to 40的数据;
      进程2将只需要处理id between 41 to 80的数据;
      进程3将只需要处理id between 81 to 100的数据。

      
      from concurrent.futures import ProcessPoolExecutor
      
      
      def main():
          # 自增id最大值
          max_id = 30000000
          # 单worker处理数据量
          worker_mission_size = 1000000
          # 使用多进程进行处理
          missions = mission_handler(max_id, worker_mission_size)
          workers = []
          executor = ProcessPoolExecutor()
          for idx, mission in enumerate(missions):
              start_id, end_id = mission
              workers.append(executor.submit(data_handler, start_id, end_id, idx))
      
      
      def data_handler(start_id, end_id, worker_id):
          pass
      

      思路总结

      1. 避免深度翻页进而使用自增id进行查询数据和数据
      2. 使用多进程处理数据

      数据处理技巧

      记录处理成功与处理失败的数据id,以便后续跟进处理

      
      # 用另外一张表记录处理状态
      insert into db.tb_handle_status(row_id, success) values (999, 0);
      

      循环体内进行异常捕获,避免程序异常退出

      
      def data_handler(start_id, end_id, worker_id):
          # 数据连接
          conn, cursor = Mysql()
          current_id = start_id
              try:
                  while current_id <= end_id:
                      try:
                          # TODO 数据处理代码
                          pass
      
                      except Exception as e:
                          # TODO 记录处理结果
                          # 数据移动到下一条
                          current_id += 1
                          continue
                      else:
                          # 无异常,继续处理下一条数据
                          current_id += 1
              except Exception as e:
                  return 'worker_id({}): result({})'.fORMat(worker_id, False)
              finally:
                  # 数据库资源释放
                  cursor.close()
                  conn.close()
      
              return 'worker_id({}): result({})'.format(worker_id, True)
      

      更新数据库数据尽量使用批量提交

      
      sql = """update db.tb set a=%s, b=%s where id=%s"""
      values = [
                  ('a_value', 'b_value', 9999),
                  ('a_value', 'b_value', 9998),
                  ...
               ]
      # 批量提交,减少网络io以及获取频率
      cursor.executemany(sql, values)
      

      以上就是mysql单表千万级数据处理的思路分享的详细内容,更多关于MySQL单表千万级数据处理的资料请关注自学编程网其它相关文章!

      您可能感兴趣的文档:

      --结束END--

      本文标题: MySQL单表千万级数据处理的思路分享

      本文链接: https://www.lsjlt.com/news/10403.html(转载时请注明来源链接)

      有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

      本篇文章演示代码以及资料文档资料下载

      下载Word文档到电脑,方便收藏和打印~

      下载Word文档
      猜你喜欢
      • MySQL千万级数据查询的优化技巧及思路
        随着数据量的不断增长,MySQL千万级数据查询的优化问题也日益引人注目。在这篇文章中,我们将深入探讨MySQL千万级数据查询优化的方法和技巧,以帮助开发者更好地优化MySQL性能。 一、数据库设计 数据库设计是优化查询性能的关键,以下是一些...
        99+
        2023-09-03
        数据库 mysql java
      • springbatch怎么处理千万级数据
        处理千万级数据的方法可以通过以下步骤实现:1. 分批读取数据:使用Spring Batch的chunk机制,将数据分批读取到内存中。...
        99+
        2023-08-18
        springbatch
      • mysql单表千万级数据查询的方法是什么
        在处理千万级数据的单表查询时,可以采取以下方法来提高查询效率: 使用合适的索引:在主键字段和经常用于查询的字段上创建索引,可以加...
        99+
        2024-03-02
        mysql
      • java怎么处理千万级数据
        处理千万级数据可以使用以下方法:1. 使用合适的数据结构:选择合适的数据结构来存储和处理数据,例如使用ArrayList、Linke...
        99+
        2024-02-29
        java
      • MySQL中怎么优化千万级数据表
        MySQL中怎么优化千万级数据表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我这里有张表,数据有1000w,目前只有一个主键索引CREATE TAB...
        99+
        2023-06-20
      • MySQL千万级数据表的优化实战记录
        前言 这里先说明一下,网上很多人说阿里规定500w数据就要分库分表。实际上,这个500w并不是定义死的,而是与MySQL的配置以及机器的硬件有关。MySQL为了提升性能,会将表的索引...
        99+
        2024-04-02
      • mysql一千万条数据如何处理
        处理一千万条数据的mysql数据库可以采取以下几种方法: 使用合适的索引:为经常使用的字段建立索引可以加快查询速度,减少数据检索...
        99+
        2024-03-02
        mysql
      • MySQL千万级数据的大表优化解决方案
        目录1.数据库设计和表创建时就要考虑性能设计表时要注意:索引简言之就是使用合适的数据类型,选择合适的索引引擎2.sql的编写需要注意优化3.分区分区的好处是:分区的限制和缺点:分区的类型:4.分表5.分库mysql数据库...
        99+
        2022-11-20
        mysql千万级数据 mysql优化
      • 千万级oracle数据表定时同步到mysql表的方案
        1:业务背景 第三方系统提供了一张oracle视图,该视图有六千多万条数据,后续每月会产生三百万条数据的数据。需要每天将数据定时同步到自己系统的mysql表中。 (注:我们系统与外界系统访问都要经过一个中间系统的跳转才行。流程如下: 我们系...
        99+
        2023-09-16
        oracle mysql 数据库
      • MySQL中怎么按表创建千万级的压测数据
        这期内容当中小编将会给大家带来有关MySQL中怎么按表创建千万级的压测数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 准备测试表CREATE TABLE...
        99+
        2024-04-02
      • 数据库SQL千万级数据规模处理有哪些
        这篇文章主要讲解了“数据库SQL千万级数据规模处理有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“数据库SQL千万级数据规模处理有哪些”吧! ...
        99+
        2024-04-02
      • 千万级数据的mysql数据库与优化方法
        本篇内容主要讲解“千万级数据的mysql数据库与优化方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“千万级数据的mysql数据库与优化方法”吧!1.对查询进行...
        99+
        2024-04-02
      • MySQL数据库千万级数据查询和存储的示例分析
        这篇文章主要介绍MySQL数据库千万级数据查询和存储的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!百万级数据处理方案数据存储结构设计表字段设计表字段 not null,因为 null 值很难查询优化且占用额...
        99+
        2023-06-15
      • MySQL如何快速的创建千万级测试数据
        备注: 此文章的数据量在100W,如果想要千万级,调大数量即可,但是不要大量使用rand() 或者uuid() 会导致性能下降 背景 在进行查询操作的性能测试或者sql优化时,我们经常需要在线下环境构建...
        99+
        2024-04-02
      • PHP分批次处理百万级数据
        PHP分批次处理百万级数据解决方案来了,假设数据量是几百万。 1、那么我们要从数据库中读取要进行数据量分批读取,以防变量内存溢出, 2、我们选择数据保存文件格式是csv文件,以方便导出之后的阅读、导入数据库等操作。 3、以防不方便ex...
        99+
        2023-09-16
        php 数据库 excel Powered by 金山文档
      • .Net Core导入千万级数据至Mysql数据库的实现方法
        目录前期准备订单测试表测试环境实现方法:1、单条数据插入2、合并数据插入3、MySqlBulkLoader插入性能测试对比最后​最近在工作中,涉及到一个数据迁移功能,从一...
        99+
        2024-04-02
      • MySQL百万数据深度分页优化思路解析
        目录业务场景瓶颈再现问题分析回表覆盖索引IOLIMTI 2000,10 ?问题总结解决方案优化前后性能对比业务场景 一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查...
        99+
        2023-05-12
        MySQL数据分页优化 MySQL分页优化百万级数据
      • mysql千万级数据量根据索引优化查询速度的实现
        (一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更...
        99+
        2024-04-02
      • mysql千万级别的数据使用count(*)查询比较慢怎么解决?
        当MySQL中的数据量达到千万级别时,使用COUNT()查询可能会变得比较慢。这是因为COUNT()会扫描整个表并计算匹配的行数,对于大表来说,这个过程可能会非常耗时。 在上图中查询一千三百多万...
        99+
        2023-09-24
        mysql 数据库 mysql千万级别数据
      • 关于angular表单动态验证的一种新思路分享
        目录引言实现方案跨字段验证器重置验证规则重置FromGroup项总结引言 在项目中,我们有时候往往需要动表单的验证做动态的规划。比如在一个注册界面中同步注册两种用户,但两种用户的输入...
        99+
        2024-04-02
      软考高级职称资格查询
      编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
      • 官方手机版

      • 微信公众号

      • 商务合作