如何使用分区处理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 kill不掉线程的原因
May 07 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
Mysql中常用的join连接方式
May 11 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
mysql全面解析json/数组
Jul 07 MySQL
Mysql数据库group by原理详解
Jul 07 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水印
2007/03/16 PHP
php 前一天或后一天的日期
2008/06/28 PHP
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
解析PHP中intval()等int转换时的意外异常情况
2013/06/21 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
2018/06/19 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
python实现马丁策略的实例详解
2021/01/15 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
大学生专科学习生活的自我评价
2013/12/07 职场文书
初中三好学生事迹材料
2014/01/13 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
员工工作能力评语
2014/12/31 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL