首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 時間範圍查詢兩大高效寫法:傳統 BETWEEN vs UNIX 時間戳優化

     編輯:MySQL 綜合教學

場景

統計每日訪問量、按小時分桶分析等「時間段」查詢極為常見。MySQL 時間類型包括 DATE、TIME、DATETIME、TIMESTAMP,儲存方式不一,但查詢邏輯相通。

方法一:傳統字符串比較(通用、直觀)

-- 查詢 2010-03-01 當天數據
SELECT COUNT(*) FROM sometable
WHERE datetime_col >= '2010-03-01 00:00:00'
  AND datetime_col <  '2010-03-02 00:00:00';
  • 優點:可讀性強,無需轉換,適用於中小數據量。
  • 缺點:字符串比較較慢,大表需建立索引且走索引範圍掃描。

方法二:UNIX 時間戳整數比較(高性能、大數據量首選)

核心函數

  • UNIX_TIMESTAMP(datetime) → 整數秒數(從 1970-01-01 00:00:00 UTC)
  • FROM_UNIXTIME(unixtime) → 還原為 DATETIME

示例

SELECT UNIX_TIMESTAMP('2010-03-01 00:00:00');  -- 1267372800
SELECT FROM_UNIXTIME(1267372800);              -- '2010-03-01 00:00:00'

查詢寫法

-- 假設表中 datetime_col 已存為 INT UNIX 時間戳
SELECT COUNT(*) FROM sometable
WHERE datetime_col >= UNIX_TIMESTAMP('2010-03-01 00:00:00')
  AND datetime_col <  UNIX_TIMESTAMP('2010-03-02 00:00:00');

或在應用層預先轉換再傳參,SQL 直接整數比較。

性能對比與選型建議

維度傳統字符串UNIX 時間戳
比較速度字符串逐字節比較整數比較,極快
索引效果B-Tree 範圍掃描同樣 B-Tree,但 CPU 開銷更低
存儲空間DATETIME 8 字節INT 4 字節(節省 50%)
時區處理依賴 session time_zoneUTC 統一,應用層轉換更可控
可讀性原生可讀需 FROM_UNIXTIME 還原
適用場景中小表、臨時查詢、強可讀性需求大表、高頻時間範圍查詢、分區鍵、跨時區系統

最佳實踐

  1. 新建大表: 直接用 INT UNSIGNED NOT NULL 存 UNIX 時間戳,建立索引。
  2. 既有表遷移: 新增 unix_ts INT 列,UPDATE SET unix_ts = UNIX_TIMESTAMP(datetime_col),驗證後切換查詢邏輯。
  3. 分區表: 以 unix_ts DIV 86400(天數)或 TO_DAYS(FROM_UNIXTIME(unix_ts)) 作為分區鍵。
  4. 應用層: 統一使用 UTC 時間戳傳輸,前端按用戶時區渲染。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved