如何使用分区处理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 24 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
MySQL为id选择合适的数据类型
Jun 07 MySQL
MySQL 如何设计统计数据表
Jun 15 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL命令无法输入中文问题的解决方式
Aug 30 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
MySQL插入数据与查询数据
Mar 25 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
mysql函数之截取字符串的实现
Aug 14 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+mysql)
2007/11/23 PHP
php 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
2016/06/17 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
python设置环境变量的原因和方法
2019/06/24 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
django使用多个数据库的方法实例
2021/03/04 Python
高中毕业生个人自我鉴定
2013/11/24 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
无房证明范本
2014/09/17 职场文书
收款委托书
2014/10/14 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
鸟的天堂导游词
2015/01/31 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
导游词之岳阳楼
2019/09/25 职场文书
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA