如何使用分区处理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字段要使用NOT NULL
May 13 MySQL
新手必备之MySQL msi版本下载安装图文详细教程
May 21 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
mysql 索引合并的使用
Aug 30 MySQL
SQL基础的查询语句
Nov 11 MySQL
MySQL 开窗函数
Feb 15 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
mysql性能优化以及配置连接参数设置
May 06 MySQL
MySQL sql模式设置引起的问题
May 15 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
星际RPG字典
2020/03/04 星际争霸
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
对javascript和select部件的结合运用
2006/10/09 PHP
基于header的一些常用指令详解
2013/06/06 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
php 多文件上传的实现实例
2016/10/23 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
jquery 查找iframe父级页面元素的实现代码
2011/08/28 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
兼容主流浏览器的JS复制内容到剪贴板
2014/12/12 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
bootstrap weebox 支持ajax的模态弹出框
2017/02/23 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
让Python代码更快运行的5种方法
2015/06/21 Python
Python验证企业工商注册码
2015/10/25 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
毕业生物理教师求职信
2013/10/17 职场文书
会计主管岗位职责范文
2013/11/08 职场文书
简短的公司员工自我评价分享
2013/11/13 职场文书
机电一体化自荐信
2013/12/10 职场文书
总经理文秘岗位职责
2014/02/03 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
工作报告范文
2019/06/20 职场文书
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
HTML中的表单元素介绍
2022/02/28 HTML / CSS
详解OpenCV曝光融合
2022/04/29 Python