首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 毫秒級時間存儲方案:拆分欄位與 VARCHAR 兩種模式

     編輯:MySQL 資料庫相關知識

MySQL 5.6 前 DATETIME/TIMESTAMP 精度僅到秒,無原生毫秒類型。但引擎能識別時間字串中的微秒部分,可通過以下兩種模式實現毫秒/微秒存儲。

方案一:拆分為秒前綴 + 微秒後綴 (推薦作主鍵)

CREATE TABLE mysql_microsecond (
  log_time_prefix TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  log_time_suffix MEDIUMINT NOT NULL DEFAULT 0,
  PRIMARY KEY (log_time_prefix, log_time_suffix)
) ENGINE=InnoDB;

-- 寫入範例
SET @dt = CONVERT(CONCAT(NOW(),'.222009'), DATETIME(6));
INSERT INTO mysql_microsecond
SELECT DATE_FORMAT(@dt, '%Y-%m-%d %H-%i-%s'), DATE_FORMAT(@dt, '%f');

-- 查詢結果
+---------------------+-----------------+
| log_time_prefix     | log_time_suffix |
+---------------------+-----------------+
| 2009-08-11 17:47:02 | 222009          |
+---------------------+-----------------+
  • MySQL 5.6.4+ 支援 DATETIME(6)/TIMESTAMP(6) 微秒精度,可直接單欄存儲,無需拆分
  • 拆分模式適配舊版本,且利於分區裁剪 (按天/月分區 log_time_prefix)

方案二:VARCHAR 存儲完整 ISO 8601 字串

CREATE TABLE log_ms (
  log_time VARCHAR(26) NOT NULL,  -- '2024-01-15 12:34:56.123456'
  PRIMARY KEY (log_time)
) ENGINE=InnoDB;
  • 優點:簡單、人類可讀、無版本依賴
  • 缺點:佔用空間大、範圍查詢需字串比較、無法直接用日期函數

方案三:BIGINT 存儲 Unix 微秒時間戳

CREATE TABLE log_us (
  log_time_us BIGINT UNSIGNED NOT NULL,  -- 微秒級 epoch
  PRIMARY KEY (log_time_us)
) ENGINE=InnoDB;
  • 最高效能、最小存儲、天然有序、跨語言無時區歧義
  • 應用層轉換:System.currentTimeMillis() * 1000 (Java)、time.time() * 1_000_000 (Python)

選型建議

場景推薦
MySQL 5.6.4+、新建表DATETIME(6) / TIMESTAMP(6) 單欄
舊版本、需分區、主鍵含時間拆分欄位 (TIMESTAMP + MEDIUMINT)
高寫入、日誌/指標類、跨系統BIGINT Unix 微秒戳
異構遷移、臨時方案VARCHAR ISO 8601
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved