如何使用分区处理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 26 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
新手入门Mysql--sql执行过程
Jun 20 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 MySQL
MySQL索引失效十种场景与优化方案
May 08 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
使用PHP提取视频网站页面中的FLASH地址的代码
2010/04/17 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
python进程与线程小结实例分析
2018/11/11 PHP
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
2016/09/23 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
python实现汽车管理系统
2018/11/30 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
python爬虫之遍历单个域名
2019/11/20 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
python unichr函数知识点总结
2020/12/16 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
墨西哥网上超市:Superama
2018/07/10 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
MIS软件工程师的面试题
2016/04/22 面试题
捐书寄语赠言
2014/01/18 职场文书
JAVA程序员自荐书
2014/01/30 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
合作协议书范本
2014/10/25 职场文书
导游词300字
2015/02/13 职场文书
博士给导师的自荐信
2015/03/06 职场文书
python 爬取吉首大学网站成绩单
2021/06/02 Python
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript