如何使用分区处理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 InnoDB存储引擎的内存管理
Apr 08 MySQL
mysql查询的控制语句图文详解
Apr 11 MySQL
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
将图片保存到mysql数据库并展示在前端页面的实现代码
May 02 MySQL
MySQL 全文索引使用指南
May 25 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
mysql timestamp比较查询遇到的坑及解决
Nov 27 MySQL
SQL基础查询和LINQ集成化查询
Jan 18 MySQL
Mysql 一主多从的部署
May 20 MySQL
sql注入报错之注入原理实例解析
Jun 10 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 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
咖啡常见的种类
2021/03/03 新手入门
QueryPath PHP 中的jQuery
2010/04/11 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
详解php的socket通信
2015/08/11 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
[40:31]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
Python文件循环写入行时防止覆盖的解决方法
2018/11/09 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
EJB3.1都有哪些改进
2012/11/17 面试题
前台接待岗位职责
2013/12/03 职场文书
教师应聘个人求职信
2013/12/10 职场文书
建议书标准格式
2014/03/12 职场文书
认购协议书范本
2014/04/22 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python
Python采集壁纸并实现炫轮播
2022/04/30 Python
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技