使用MySQL處理億級數據

mysql在查詢上千萬級數據的時候,通過索引可以解決大部分查詢優化問題。但是在處理上億數據的時候,需要用到的東西就超出索引的範圍了。

數據表(日誌)是這樣的:

  • 表大小:1T,約24億行;
  • 表分區:按時間分區,每個月爲一個分區,一個分區約2-3億行數據(40-70G左右)。
  • 操作日誌含有json字段。

經過與需求方討論後,我們決定只取某一個月的數據作爲樣本,該樣本的數據行數約3.5億行。
數據處理的思路:

  • 1)由於數據是按月分區的,我們將該月分區的數據單獨copy出來,源表爲myisam引擎,因我們可能需要過濾部分數據,涉及到篩選的字段又沒有索引,使用myisam引擎加索引的速度會比較慢,建議目標表用innodb引擎;
  • 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)對上述生成的結果進行整理加工。

總的來說,過程是相對繁瑣,而且產生了很多中間表,如果能用hive來查詢儘量不用mysql。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章