MySQL 5.6.4 之前,DATETIME/TIMESTAMP 僅支援秒級精度,無法原生存儲毫秒/微秒。雖然 5.6.4+ 已支援 DATETIME(6)/TIMESTAMP(6),但歷史版本升級成本高、或受限於舊框架,仍需兼容方案。本文介紹三種主流變通模式並對比優劣。
利用 TIMESTAMP 存秒,MEDIUMINT 存微秒(0~999999),聯合主鍵保證唯一性。
CREATE TABLE mysql_microsecond (
log_time_prefix TIMESTAMP NOT NULL DEFAULT 0,
log_time_suffix MEDIUMINT NOT NULL DEFAULT 0
) ENGINE=InnoDB;
ALTER TABLE mysql_microsecond ADD PRIMARY KEY (log_time_prefix, log_time_suffix);
-- 寫入示例
SET @a = CONVERT(CONCAT(NOW(), '.222009'), DATETIME);
INSERT INTO mysql_microsecond
SELECT DATE_FORMAT(@a, '%Y-%m-%d %H:%i:%s'), DATE_FORMAT(@a, '%f');
-- 查詢還原
SELECT log_time_prefix, log_time_suffix,
CONCAT(log_time_prefix, '.', LPAD(log_time_suffix, 6, '0')) AS full_time
FROM mysql_microsecond;
CREATE TABLE log_time_str ( log_time VARCHAR(26) NOT NULL, -- '2024-05-18 12:34:56.123456' PRIMARY KEY (log_time) ) ENGINE=InnoDB;
CREATE TABLE log_hash ( time_hash CHAR(32) NOT NULL, -- MD5/SHA1 時間字符串 log_time_prefix TIMESTAMP NOT NULL, log_time_suffix MEDIUMINT NOT NULL, PRIMARY KEY (time_hash) ) ENGINE=InnoDB;
| 維度 | 拆分存儲 | VARCHAR 全量 | 哈希主鍵 |
|---|---|---|---|
| 存儲空間 | ~11 字節/行 | ~26 字節/行 | ~43 字節/行(含哈希) |
| 範圍查詢 | 優(索引下推) | 差(全表掃描) | 不可用 |
| 寫入性能 | 良 | 良 | 極佳(定長主鍵) |
| 應用改造 | 中 | 低 | 高 |
DATETIME(6)/TIMESTAMP(6),原生支援微秒,最省心。核心原則:優先用原生類型;不可用時,根據查詢模式在「空間、範圍查詢、寫入吞吐」三角中取捨。