如何使用分区处理MySQL的亿级数据优化


Posted in MySQL onJune 18, 2021

mysql在查询上千万级数据的时候,通过索引可以解决大部分查询优化问题。但是在处理上亿数据的时候,索引就不那么友好了。

数据表(日志)是这样的:

  • 表大小:1T,约24亿行;
  • 表分区:按时间分区,每个月为一个分区,一个分区约2-3亿行数据(40-70G左右)。

由于数据不需要全量处理,经过与需求方讨论后,我们按时间段抽样一部分数据,比如抽样一个月的数据,约3.5亿行。
数据处理的思路:

1)建表引擎选择Innodb。由于数据是按月分区的,我们将该月分区的数据单独copy出来,源表为myisam引擎,因我们可能需要过滤部分数据,涉及到筛选的字段又没有索引,使用myisam引擎加索引的速度会比较慢;
2)按日分区。将copy出来的表加好索引后(约2-4个小时),过滤掉无用的数据,同时再次新生成一张表,抽取json中需要的字段,并对该表按日分区。

CREATE TABLE `tb_name` (
  `id_`,
  ...,
  KEY `idx_1` (`create_user_`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='应用日志'
PARTITION BY RANGE(to_days(log_time_)) (
    PARTITION p1231 VALUES LESS THAN (737425),
    PARTITION p0101 VALUES LESS THAN (737426),
    PARTITION p0102 VALUES LESS THAN (737427),
    PARTITION p0103 VALUES LESS THAN (737428),
    PARTITION p0104 VALUES LESS THAN (737429),
......
);

3)对上面生成的表按每日进行聚合或者其他操作,并将结果存储到临时表中,尽量使用存储过程加工数据,由于加工相对复杂而且耗时较多(跑一次存储过程需要大概1-2小时),因此循环调用存储过程时应记录操作时间和执行过程中的参数等;

delimiter $$
create procedure proc_name(param varchar(50))
begin
 declare start_date date;
    declare end_date date;
    set start_date = '2018-12-31';
    set end_date = '2019-02-01';
    
    start transaction;
 truncate tmp_talbe;
 commit;
    
    while start_date < end_date do
  set @partition_name = date_format(start_date, '%m%d');
        set @start_time = now(); -- 记录当前分区操作起始时间
        
  start transaction;
  set @sqlstr = concat(
   "insert into tmp_talbe",
   "select field_names ",
            "from tb_name partition(p", @partition_name,") t ",
            "where conditions;"
   );
  -- select @sqlstr;
  prepare stmt from @sqlstr;  
  execute stmt;
  deallocate prepare stmt;
  commit;
        
        -- 插入日志
        set @finish_time = now(); -- 操作结束时间
        insert into oprerate_log values(param, @partition_name, @start_time, @finish_time, timestampdiff(second, @start_time, @finish_time));
        
  set start_date = date_add(start_date, interval 1 day);
    end while;
end
$$
delimiter ;

4)对上述生成的结果进行整理加工。

总的来说,处理过程相对繁琐,而且产生了很多中间表,对关键步骤还需要记录操作流程的元数据,这对SQL处理的要求会比较高,因此不建议使用MySQL处理这种任务(除非迫不得已),如果能将能处理过程放在大数据平台上处理,速度会更快,而且元数据管理会相对专业。

到此这篇关于如何使用分区处理MySQL的亿级数据优化的文章就介绍到这了,更多相关MySQL 亿级数据优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL查询学习之基础查询操作
May 08 MySQL
MySQL表字段时间设置默认值
May 13 MySQL
MySQL通过binlog恢复数据
May 27 MySQL
MySQL中in和exists区别详解
Jun 03 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
详解Mysql数据库平滑扩容解决高并发和大数据量问题
May 25 MySQL
详解MySQL中的pid与socket
Jun 15 #MySQL
MySQL 如何设计统计数据表
Jun 15 #MySQL
浅谈MySQL 亿级数据分页的优化
解析MySQL binlog
详细谈谈MYSQL中的COLLATE是什么
Jun 11 #MySQL
探究Mysql模糊查询是否区分大小写
安装配置mysql及Navicat prenium的详细流程
You might like
php使用GD实现颜色渐变实例
2015/06/02 PHP
yii2 页面底部加载css和js的技巧
2016/04/21 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
javascript复制对象使用说明
2011/06/28 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
js 作用域和变量详解
2017/02/16 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
vue 组件中slot插口的具体用法
2018/04/03 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
python下10个简单实例代码
2017/11/15 Python
python二元表达式用法
2019/12/04 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
如何理解python面向对象编程
2020/06/01 Python
泰国在线书店:SE-ED
2020/06/21 全球购物
2013年保送生自荐信格式
2013/11/20 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
灰雀教学反思
2014/04/28 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
新闻稿件写作范文
2015/07/18 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL
关于Vue中的options选项
2022/03/22 Vue.js