如何使用分区处理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 31 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
MySql 缓存查询原理与缓存监控和索引监控介绍
Jul 02 MySQL
MySQL如何解决幻读问题
Aug 07 MySQL
MySQL into_Mysql中replace与replace into用法案例详解
Sep 14 MySQL
MySQL创建定时任务
Jan 22 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
MySQL数据库表约束讲解
Jun 21 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/03/23 PHP
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
javascript中&quot;/&quot;运算符常见错误
2010/10/13 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
2016/11/23 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
举例详解Python中yield生成器的用法
2015/08/05 Python
python负载均衡的简单实现方法
2018/02/04 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
python 常见的排序算法实现汇总
2020/08/21 Python
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
法定代表人授权委托书范文
2014/09/22 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
React Fragment介绍与使用详解
2021/11/11 Javascript