如何使用分区处理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 相关文章推荐
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
MySQL Router实现MySQL的读写分离的方法
May 27 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 MySQL
mysql 索引的数据结构为什么要采用B+树
Apr 26 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 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个人网站架设连环讲(三)
2006/10/09 PHP
php中ob函数缓冲机制深入理解
2015/08/03 PHP
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
js中判断用户输入的值是否为空的简单实例
2013/12/23 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
Saltstack快速入门简单汇总
2016/03/01 Python
Python字符串格式化输出方法分析
2016/04/13 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
Python当中的array数组对象实例详解
2019/06/12 Python
python异常触发及自定义异常类解析
2019/08/06 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
Python求两个字符串最长公共子序列代码实例
2020/03/05 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
前台文员岗位职责
2013/12/28 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
护理目标管理责任书
2014/07/25 职场文书
给下属加薪申请报告
2015/05/15 职场文书
开学典礼观后感
2015/06/15 职场文书
贫困生证明范文
2015/06/16 职场文书
golang中的空slice案例
2021/04/27 Golang
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
Python装饰器的练习题
2021/11/23 Python
Golang获取List列表元素的四种方式
2022/04/20 Golang