我有一个包含字段的表::ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
我的问题是,如果我在这个表上使用延迟插入,时间戳是请求排队的时间还是实际插入的时间?
最佳答案
答案是在请求排队时,但在发出请求时不一定是正确的,因为如果尚未建立表的线程,则请求会在建立后排队。
The thread executes the INSERT statement, but instead of writing the row to the table, it puts a copy of the final row into a queue that is managed by the handler thread. Any syntax errors are noticed by the thread and reported to the client program.
延迟语句执行时的事件顺序:
- 如果表的处理程序线程还没有,则创建一个处理程序线程
- 处理程序检查或等待获取
DELAYED
锁 - 处理程序执行
INSERT
并将最后一行放入队列 - 当实际插入该行时,更新二进制日志
- 处理程序一次写入
delayed_insert_limit
行,并在写入之间执行任何挂起的SELECTS
- 当队列为空时,释放
DELAYED
锁
根据是否需要创建线程以及检查或获取DELAYED
锁需要多长时间,执行语句(步骤0)和执行语句之间的时间声明(第 3 步)会有所不同。然后,根据队列的大小(特别是如果它超过 delayed_insert_limit
行),以及是否有任何未决的 SELECTS
发生,写入将被延迟一些不可预测的时间.
关于mysql延迟插入时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4410878/