如何使用分区处理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基础(二)
Apr 05 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
Mysql 如何查询时间段交集
Jun 08 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
Mar 03 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
优化Mysql查询的示例
Apr 26 MySQL
MySQL 字符集 character
May 04 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 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数组生成XML格式数据的封装类实例
2016/11/10 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
javascript静态的url如何传递
2007/05/03 Javascript
js+css在交互上的应用
2010/07/18 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
Javascript的比较汇总
2016/07/25 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
zookeeper python接口实例详解
2018/01/18 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
Python制作动态字符图的实例
2019/01/27 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
小学数学课题方案
2014/06/15 职场文书
党支部特色活动方案
2014/08/20 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
闪闪的红星观后感
2015/06/08 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js