【问题标题】:mysql delayed insert timestampmysql延迟插入时间戳
【发布时间】:2010-12-10 16:15:42
【问题描述】:

我有一个带有字段的表格:: ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP

我的问题是,如果我在这张表上使用延迟插入,时间戳是请求排队的时间还是实际插入的时间?

【问题讨论】:

    标签: mysql insert timestamp delayed-execution


    【解决方案1】:

    答案是在请求排队时,但在发出请求时不一定正确,因为如果还没有表的线程,则在建立表线程后请求排队。

    来自mysql 5.1 dev docs

    线程执行INSERT 声明,而不是写 行到表中,它放了一个副本 最后一行放入队列中 由处理程序线程管理。任何 语法错误被注意到 线程并报告给客户端 程序。

    延迟语句执行时的事件顺序:

    1. 如果还没有,则会为表创建一个处理程序线程
    2. 处理程序检查或等待获得DELAYED
    3. 处理程序执行INSERT 并将最后一行放入队列
    4. 当实际插入行时,更新二进制日志
    5. 处理程序一次写入delayed_insert_limit 行,并在写入之间执行任何待处理的SELECTS
    6. 当队列为空时,DELAYED 锁被释放

    取决于是否需要创建线程以及检查或获取DELAYED锁需要多长时间,执行语句(步骤0)和执行语句(步骤3)之间的时间) 会有所不同。然后,根据队列的大小(尤其是超过delayed_insert_limit 行),以及是否有任何待处理的SELECTS 发生,写入将延迟一些不可预测的时间。

    【讨论】:

    • 我认为你是对的(但不确定)。因为,如果线程执行语句以报告语法错误(如果有),它可能还会将 CURRENT_TIMESTAMP“扩展”为实际时间戳。
    【解决方案2】:

    无论是否使用INSERT DELAYED,或者如果表由于另一个线程或更新或其他原因而被锁定,ts 的值将等于发出INSERT 的时间。

    【讨论】:

    • 您是指处理程序线程进行的“虚拟”INSERT 还是在数据库中实际完成的INSERT。
    【解决方案3】:

    应该是实际插入的时间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2017-01-01
      • 2020-12-13
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2016-03-06
      相关资源
      最近更新 更多