如何使用分区处理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 相关文章推荐
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
Mysql数据库手动及定时备份步骤
Nov 07 MySQL
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
Mysql 8.x 创建用户以及授予权限的操作记录
Apr 18 MySQL
pt-archiver 主键自增
Apr 26 MySQL
mysql性能优化以及配置连接参数设置
May 06 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
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生成EAN_13标准条形码实例
2013/11/13 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
php多线程并发实现方法
2016/09/30 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
js实现进度条的方法
2015/02/13 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
express.js中间件说明详解
2019/03/19 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python中print函数简单使用总结
2019/08/05 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Python 自由定制表格的实现示例
2020/03/20 Python
Python中qutip用法示例详解
2020/10/02 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
优秀团员个人的自我评价
2013/10/02 职场文书
护理专业毕业生自我鉴定
2013/10/08 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
初中重阳节活动总结
2015/05/05 职场文书
五一放假通知怎么写
2015/08/18 职场文书