目前有一个需求,需要读取一个表,表的数据是第三方去写入,我需要写服务监听这个表,按上一次记录的最后更新时间做开始节点去处理这些数据。
表结构大致如下:
CREATE TABLE test (
id bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键 ID',
val varchar(128) NOT NULL COMMENT '数据',
update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
COMMENT '更新时间(修改时自动更新)'
)
SQL:
select * from test where update_time>@上一次最后修改时间 order by update_time limit 5000 offset 0;
难点:
1 、目前项目使用的是 MySQL ,MySQL 没有 SqlServer 那种 timestamp 时间戳,只要数据更新就会更新唯一的时间戳,MySQL 的时间戳是可以重复的。
2 、第三方不只是插入数据,可以修改历史的数据,这样意味着不能使用自增主键作为最后修改的节点,必须使用时间戳作为条件。
3 、数据量预计是千万级,我需要分页分批处理,又因为 MySQL 时间戳能重复,不能不断缩小时间范围,只能使用 limit offset 分页,当数据量大时效率很低,即使击中了索引,数据不断累积也会越来越慢。
场景:
id update_time
201 2021-12-02 00:00:02
202 2021-12-02 00:00:02
203 2021-12-02 00:00:02
======分页=======
204 2021-12-02 00:00:02
205 2021-12-02 00:00:02
206 2021-12-02 00:00:02
求求大佬指导一下,MySQL 有没有类似 SqlServer 的时间戳数据类型,SQL 和分批处理的设计能不能优化一下。
表结构大致如下:
CREATE TABLE test (
id bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键 ID',
val varchar(128) NOT NULL COMMENT '数据',
update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
COMMENT '更新时间(修改时自动更新)'
)
SQL:
select * from test where update_time>@上一次最后修改时间 order by update_time limit 5000 offset 0;
难点:
1 、目前项目使用的是 MySQL ,MySQL 没有 SqlServer 那种 timestamp 时间戳,只要数据更新就会更新唯一的时间戳,MySQL 的时间戳是可以重复的。
2 、第三方不只是插入数据,可以修改历史的数据,这样意味着不能使用自增主键作为最后修改的节点,必须使用时间戳作为条件。
3 、数据量预计是千万级,我需要分页分批处理,又因为 MySQL 时间戳能重复,不能不断缩小时间范围,只能使用 limit offset 分页,当数据量大时效率很低,即使击中了索引,数据不断累积也会越来越慢。
场景:
id update_time
201 2021-12-02 00:00:02
202 2021-12-02 00:00:02
203 2021-12-02 00:00:02
======分页=======
204 2021-12-02 00:00:02
205 2021-12-02 00:00:02
206 2021-12-02 00:00:02
求求大佬指导一下,MySQL 有没有类似 SqlServer 的时间戳数据类型,SQL 和分批处理的设计能不能优化一下。