如何使用分区处理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 相关文章推荐
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
MySQL 开窗函数
Feb 15 MySQL
MySql重置root密码 --skip-grant-tables
Apr 11 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 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使用正则表达式清除超链接文本
2013/11/12 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
PHP实现验证码校验功能
2017/11/16 PHP
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
Python编写电话薄实现增删改查功能
2016/05/07 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
python实现xml转json文件的示例代码
2020/12/30 Python
Python3.9.1中使用split()的处理方法(推荐)
2021/02/07 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
公务员培训自我鉴定
2013/09/19 职场文书
技术人员面试提纲
2013/11/28 职场文书
预备党员思想汇报范文
2013/12/29 职场文书
工作睡觉检讨书
2014/02/25 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
销售团队获奖感言
2014/08/14 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
体育教师教学随笔
2015/08/15 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
Python利用capstone实现反汇编
2022/04/06 Python