如何使用分区处理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 相关文章推荐
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
SQL 聚合、分组和排序
Nov 11 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
MySql重置root密码 --skip-grant-tables
Apr 11 MySQL
Mysql查询时间区间日期列表,不会由于数据表数据影响
Apr 19 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
SQLServer常见数学函数梳理总结
Aug 05 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程序实现支持页面后退的两种方法
2008/06/30 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
Js基础学习资料
2010/11/23 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
2013/07/09 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
javaScript基础详解
2017/01/19 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
微信小程序合法域名配置方法
2019/05/06 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
python删除列表中重复记录的方法
2015/04/28 Python
django允许外部访问的实例讲解
2018/05/14 Python
Numpy数据类型转换astype,dtype的方法
2018/06/09 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
sklearn的predict_proba使用说明
2020/06/28 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
杭州联环马网络笔试题面试题
2013/08/04 面试题
大学四年学习的自我评价分享
2013/12/09 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书