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 · 2481 次点击
    这是一个创建于 1120 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前有一个需求,需要读取一个表,表的数据是第三方去写入,我需要写服务监听这个表,按上一次记录的最后更新时间做开始节点去处理这些数据。

    表结构大致如下:

    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   ·   实用小工具   ·   2683 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 348ms · UTC 12:47 · PVG 20:47 · LAX 04:47 · JFK 07:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.