我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL两千万数据优化&迁移

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL两千万数据优化&迁移

最近有一张2000W条记录的数据表需要优化和迁移。2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升。不过这些数据有大量的冗余字段和错误信息,极不方便做统计和分析。所以我需要创建一张新表,把旧表中的数据一条一条取出来优化后放回新表;

一. 清除冗余数据,优化字段结构

2000W数据中,能作为查询条件的字段我们是预知的。所以将这部分数据单独创建新的字段,对于有规则的数据合理改变字段结构,比如身份证就是varchar(18)。对于不重要的数据我们合并后存在一个结构为text的字段。

对于一些有关联的数据我们需要计算,常见的比如身份证种能获取到准确的性别,出生地、生日、年龄。

二. 数据迁移

我们从数据库中取出一条旧数据,再通过计算处理后得到想要的新数据,最后将新数据插入新表。不过在获取新数据时遇到如下问题。

  1. 数据量太大,无法一次获取(2000W数据扔到内存挺可怕的);

    我们可以通过MySQL的limit语法分批获取。比如每次获取50000,SQL语句如下:

    select * from table_name limit 15000000,50000;

    通过这种方法能解决数据量太大的问题,但是随着limit的第一个参数越来越大,查询速度会慢的吓人(上面这条SQL执行会花35秒)。时间就是生命,于是我们开始优化SQL语句,优化后变成下面这样:

    select * from table_name order by id desc limit 5000000,50000;

    可通过二分法拆分2000W数据,当执行到1000W数据时,将数据倒序。优化后SQL执行效率显著提升,从35秒降到9秒;

    不过还是很慢,时间就是生命……还好我们有自增ID(创建数据表第一条定律,一定要有自增字段),优化后的SQl如下:

    1. select * from table_name where id>15000000 and id<15050000; 2. select * from table_name where id>15000000 limit 50000;

    为了直观演示,我写了两条功能一样的SQL。相比第一条,第二条的limit会导致SQL的索引命中变差,效率同样也会下降。第一条SQL的执行时间是2毫秒,第二条执行时间5毫秒(我取的平均值)。每次数据的查询速度直接从35秒降到2毫秒……

  2. 数据量太大并且数据无法预估,某些特殊数据会导致数据导入失败;

    我们有三种方案去将新数据存入新表,分别如下:

    1. 一条一条插入数据;

      开始肯定会想这种方案一定不行,因为每次插入都会有一次数据库IO操作。但是该方案有个好处是能及时发现有问题的数据,修改后再继续执行; 在Oracle中使用『绑定变量』能带来性能提升,正好MySQL也提供了『绑定变量』的功能。于是在不改变逻辑的情况下,尝试优化数据存储速度。代码如下:

      public function actionTest(array $data)
      {
          $mysqli = new mysqli("192.168.1.106", "username", "password", "test");
          $sql = "insert into table_name(name,identity) values (?,?)";
      
          $stmt = $connection->prepare($sql);
          $name = "";
          $identity = "";
          //使用绑定变量
          $stmt->bind_param("si", $name, $identity);
          foreach($data as $val)
          {
              $name = $val[name];
              $identity = $val[card_id];
              //执行
              $stmt->execute();
          }
          $stmt->close();
      }

      最后效果不怎么好,MySQL的『绑定变量』并没带来明显的速度提升,不过能有效的防止SQL注入;

    2. 一次插入50000条数据;

      这是我最后选中的方案,一是能及时发现有问题的数据,二是导入数据非常稳定。就像支持断点续传一样,每一步都能看到效果。在执行脚本时,也能同步开始写分析逻辑;

    3. 组装成SQL文件,最后统一导入;

      组装一个大的SQL文件,最后通过MySQL自带的工具导入也是极好的。但如果有一条SQL有问题,你可能需要重跑一次脚本。因为在9G大小的文本文件中修改一个符号是很痛苦的事情……

三. 总结

通过各种优化,最后将脚本执行时间缩短到了20分钟内。优化后数据质量得到了较高保证,下次将尝试2亿数据的优化&迁移……

 

 

来自:https://yq.aliyun.com/articles/59907

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL两千万数据优化&迁移

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

下载Word文档

猜你喜欢

MySQL两千万数据优化&迁移

最近有一张2000W条记录的数据表需要优化和迁移。2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升。不过这些数据有大量的冗余字段和错误信息,极不方便做统计和分析。所以我需要创建一张新表
2022-05-25

MySQL中怎么优化千万级数据表

MySQL中怎么优化千万级数据表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我这里有张表,数据有1000w,目前只有一个主键索引CREATE TABLE `u
2023-06-20

MySQL两千万数据大表优化过程,三种解决方案!

使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死。严重影响业务。 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql
MySQL两千万数据大表优化过程,三种解决方案!
2019-01-13

php千万级数据如何优化

优化千万级数据的方法主要包括以下几方面:1. 数据库优化:对数据库进行索引、分区、分表等操作,提高数据库的读写性能。可以根据查询频率和数据关联关系等因素,合理设计和优化数据库表结构,减少数据冗余和查询开销。2. 查询优化:通过合理的查询语句
2023-09-06

MySQL千万级数据的大表优化解决方案

目录1.数据库设计和表创建时就要考虑性能设计表时要注意:索引简言之就是使用合适的数据类型,选择合适的索引引擎2.sql的编写需要注意优化3.分区分区的好处是:分区的限制和缺点:分区的类型:4.分表5.分库mysql数据库中的表数据量几千万后
2022-11-20

45亿数据迁移记录后续-日数据量千万级别到clickhouse

思路2 : 扔掉flume,使用waterdrop直接读取日志,清洗处理,然后直接到clickhous。关于waterdrop处理日志,之前博客,可翻阅进行参考。这个方案是错误的,因为我之前并没有正确了解waterdrop,waterdrop并不支持实时数据处
45亿数据迁移记录后续-日数据量千万级别到clickhouse
2016-09-20

Linux下HBase数据迁移优化

在Linux环境下进行HBase数据迁移时,可以采取以下优化措施来提高迁移效率和质量:使用HBase自带的迁移工具:HBase提供了如hbase org.apache.hadoop.hbase.mapreduce.Export和hbase
Linux下HBase数据迁移优化
2024-10-20

MySQL千万数据量深分页优化流程(拒绝线上故障)

目录引言mysql 同步 ES 流程如下:软硬件说明重新认识 MySQL 分页深分页优化子查询优化延迟关联书签记录ORDER BY 巨坑, 慎踩ORDER BY 索引失效举例结言引言优化项目代码过程中发现一个千万级数据深分页问题,缘由是这
2023-05-16

如何优化数据库的数据迁移学习

数据迁移是指将数据从一个数据库系统移动到另一个数据库系统的过程。在进行数据迁移时,我们可以采取一些优化措施来提高数据迁移的效率和准确性。以下是一些优化数据库数据迁移学习的方法:确定数据迁移的目标和范围:在进行数据迁移之前,首先要确定数据迁移
如何优化数据库的数据迁移学习
2024-07-03

编程热搜

目录