V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
? MySQL 5.5 Community Server
? MySQL 5.6 Community Server
? Percona Configuration Wizard
? XtraBackup 搭建主从复制
Great Sites on MySQL
? Percona
? MySQL Performance Blog
? Severalnines
推荐管理工具
? Sequel Pro
? phpMyAdmin
推荐书目
? MySQL Cookbook
MySQL 相关项目
? MariaDB
? Drizzle
参考文档
? http://mysql-python.sourceforge.net/MySQLdb.html
jtwor
V2EX  ?  MySQL

求助, MySQL 时间戳问题

  •  
  •   jtwor · 2021-12-03 11:12:48 +08:00 · 2228 次点击
    这是一个创建于 880 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前有一个需求,需要读取一个表,表的数据是第三方去写入,我需要写服务监听这个表,按上一次记录的最后更新时间做开始节点去处理这些数据。

    表结构大致如下:

    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 和分批处理的设计能不能优化一下。
    10 条回复  ?  2021-12-08 18:31:15 +08:00
    jorneyr
        1
    jorneyr  
       2021-12-03 11:29:44 +08:00
    updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
    jtwor
        2
    jtwor  
    OP
       2021-12-03 11:32:42 +08:00
    @jorneyr 现在的最后修改时间已经是用这种自动更新时间戳了,主要是时间不是唯一,批量 insert into select 时间都一样。。
    liprais
        3
    liprais  
       2021-12-03 11:39:50 +08:00   ?? 2
    直接 cdc 完事
    jtwor
        4
    jtwor  
    OP
       2021-12-03 11:50:41 +08:00
    @liprais 这个阔以,但菜鸡的我不敢用到生产。。
    wlkq
        5
    wlkq  
       2021-12-03 12:00:38 +08:00
    你看看“触发器”能不能搞你这个需求,但是触发器需要更高的权限
    lllby1102
        6
    lllby1102  
       2021-12-03 12:55:20 +08:00
    @wlkq 从管理的角度,非常不建议使用触发器,维护很恶心的。
    laozhoubuluo
        7
    laozhoubuluo  
       2021-12-03 13:17:36 +08:00 via Android
    感觉与其折腾时间戳,还不如要求对方维护一个单向自增的 ID ,只要数据修改就要改 ID ,bigint unsigned 足够用到天荒地老。
    TypeErrorNone
        8
    TypeErrorNone  
       2021-12-03 13:50:36 +08:00
    增量处理数据
    1. 添加一个状态字段
    2. 第三方操作(插入,更新)后的数据状态都是 1
    3. 你的脚本处理完的数据状态都设置为 2
    4. 你的脚本每次开始获取数据时,只取状态=1 的数据
    Yi23
        9
    Yi23  
       2021-12-03 19:20:36 +08:00
    时间这个是不是可以使用 datatime 类型,加上长度,保存到毫秒(微秒)?
    slomo
        10
    slomo  
       2021-12-08 18:31:15 +08:00
    一定要 mysql 吗,时序数据库不好吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2504 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 855ms · UTC 14:39 · PVG 22:39 · LAX 07:39 · JFK 10:39
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com