9

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

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

4

3 回答 3

6

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

来自mysql 5.1 开发文档

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

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

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

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

于 2010-12-10T16:20:41.460 回答
1

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

于 2010-12-10T16:26:07.487 回答
0

它应该花费实际插入的时间

于 2010-12-10T16:18:48.647 回答