如何使用分区处理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获取所有分类的前N条记录
May 07 MySQL
JDBC连接的六步实例代码(与mysql连接)
May 12 MySQL
mysql在项目中怎么选事务隔离级别
May 25 MySQL
MySQL 全文索引使用指南
May 25 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL分库分表详情
Sep 25 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 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利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
PHP导入导出Excel代码
2015/07/07 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
Laravel下生成验证码的类
2017/11/15 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
如何查找网页漏洞
2016/06/22 面试题
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
境外导游求职信
2014/02/27 职场文书
银行求职信
2014/05/31 职场文书
家长学校培训材料
2014/08/20 职场文书
秋季运动会开幕词
2015/01/28 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang
源码安装apache脚本部署过程详解
2022/09/23 Servers