最近發現一個問題,在使用MySQL8.0新的延遲計算方式來計算主從延遲時,如果延遲過大,計算出的結果和原先Seconds_Behind_Master的差異特別大,一開始以爲是寫的SQL存在問題,校驗了幾次發現不對,是兩個時間字段計算的結果異常導致,下面是具體的驗證方式
-- 創建一張包含2個時間字段的表
create table t1(dt1 datetime,dt2 datetime)
-- 插入3條數據,三條數據分別爲時間差小於1分鐘/時間差等於1分鐘/時間差大於1分鐘
insert into t1 select '2022-05-27 00:00:55','2022-05-27 00:00:00';
insert into t1 select '2022-05-27 00:01:00','2022-05-27 00:00:00';
insert into t1 select '2022-05-27 00:01:05','2022-05-27 00:00:00';
-- 表中數據示例
+---------------------+---------------------+
| dt1 | dt2 |
+---------------------+---------------------+
| 2022-05-27 00:00:55 | 2022-05-27 00:00:00 |
| 2022-05-27 00:01:00 | 2022-05-27 00:00:00 |
| 2022-05-27 00:01:05 | 2022-05-27 00:00:00 |
+---------------------+---------------------+
-- 對數據做各種處理查看輸出的結果
SELECT DT1 - DT2 "時間直接做減法",
CONVERT(DT1, UNSIGNED INTEGER) - CONVERT(DT2, UNSIGNED INTEGER) "將時間轉換爲整數做減法",
UNIX_TIMESTAMP(DT1) - UNIX_TIMESTAMP(DT2) "轉換爲時間戳做減法",
TIME_TO_SEC(TIMEDIFF(DT1, DT2)) "用時間函數處理"
FROM T1;
+----------------+------------------------+--------------------+----------------+
| 時間直接做減法 | 將時間轉換爲整數做減法 | 轉換爲時間戳做減法 | 用時間函數處理 |
+----------------+------------------------+--------------------+----------------+
| 55 | 55 | 55 | 55 |
| 100 | 100 | 60 | 60 |
| 105 | 105 | 65 | 65 |
+----------------+------------------------+--------------------+----------------+
可以看到,當小於一分鐘時,時間相減不存在問題
當等於或大於一分鐘時,實際上MySQL把時間類型轉換爲了整數型做計算
- 00:01:00 變爲了100
- 00:01:05 變爲了105