通常大家在讲mysql 单表不要存储大数据量,但是实际工作中经常接触mysql表存储千万、上亿的数据。
如果有需求对这张表做修改。
一种方案使用pt-online-schema-change 这种。
还有一种如果业务相对独立的话,可以对这张表做抽离,这时候就需要跑脚本。
比如有1000万数据,通常的做法就是对这一千万数据做切片,比如1-100,101-200 ,多个进程依次处理。
那实际处理过程中就是这样,
```
创建一张表,每次更新下一次起始值next_start。
查询的时候就是id>next_start 这里不能用offset limit。mysql 底层是b+ 树结构,叶子节点是双向链表,支持范围查询,where 条件可以直接命中索引,查询效率会比较高。
创建执行进度表,记录当前脚本执行的开始值,以及执行到那个位置的ID。(start_id,end_id)这个是用来查看脚本执行到那个位置。
假如进程1执行过程中,定时任务2又开始启动了,这时候任务2就会从next_start 处继续执行接下来的脚本。
这时候对任务1也没有任何影响,这样就实现了多进程执行脚本。
这时候需要注意的就是对多进程的限制,可以根据当前脚本执行进度表来判断执行任务的进程数量来判断。
基于这些就可以实现对千万数据和上亿数据的脚本刷新。
```
评论