› 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 · Dec 3, 2021 · 3690 views
    This topic created in 1765 days ago, the information mentioned may be changed or developed.
    目前有一个需求,需要读取一个表,表的数据是第三方去写入,我需要写服务监听这个表,按上一次记录的最后更新时间做开始节点去处理这些数据。

    表结构大致如下:

    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 replies  •  2021-12-08 18:31:15 +08:00
    jorneyr
        1
    jorneyr  
       Dec 3, 2021
    updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
    jtwor
        2
    jtwor  
    OP
       Dec 3, 2021
    @jorneyr 现在的最后修改时间已经是用这种自动更新时间戳了,主要是时间不是唯一,批量 insert into select 时间都一样。。
    F281M6Dh8DXpD1g2
        3
    F281M6Dh8DXpD1g2  
       Dec 3, 2021   ❤️ 2
    直接 cdc 完事
    jtwor
        4
    jtwor  
    OP
       Dec 3, 2021
    @liprais 这个阔以,但菜鸡的我不敢用到生产。。
    wlkq
        5
    wlkq  
       Dec 3, 2021
    你看看“触发器”能不能搞你这个需求,但是触发器需要更高的权限
    lllby1102
        6
    lllby1102  
       Dec 3, 2021
    @wlkq 从管理的角度,非常不建议使用触发器,维护很恶心的。
    laozhoubuluo
        7
    laozhoubuluo  
       Dec 3, 2021 via Android
    感觉与其折腾时间戳,还不如要求对方维护一个单向自增的 ID ,只要数据修改就要改 ID ,bigint unsigned 足够用到天荒地老。
    TypeErrorNone
        8
    TypeErrorNone  
       Dec 3, 2021
    增量处理数据
    1. 添加一个状态字段
    2. 第三方操作(插入,更新)后的数据状态都是 1
    3. 你的脚本处理完的数据状态都设置为 2
    4. 你的脚本每次开始获取数据时,只取状态=1 的数据
    Yi23
        9
    Yi23  
       Dec 3, 2021
    时间这个是不是可以使用 datatime 类型,加上长度,保存到毫秒(微秒)?
    slomo
        10
    slomo  
       Dec 8, 2021
    一定要 mysql 吗,时序数据库不好吗
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2323 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 08:05 · PVG 16:05 · LAX 01:05 · JFK 04:05
    ♥ Do have faith in what you're doing.