業務中頻繁需要按時間維度篩選數據,正確使用日期函數與索引友好寫法,能避免全表掃描,大幅提升查詢性能。本文總結常用時間範圍查詢模式。
❌ 反模式(導致索引失效):
WHERE DATE(create_time) = CURDATE()
WHERE YEAR(create_time) = 2024 AND MONTH(create_time) = 1
WHERE TO_DAYS(create_time) = TO_DAYS(NOW())
✅ 推薦模式(利用索引範圍掃描):
WHERE create_time >= '2024-01-15 00:00:00'
AND create_time < '2024-01-16 00:00:00'
| 需求 | 索引友好寫法 | 說明 |
|---|---|---|
| 今天 | create_time >= CURDATE() AND create_time < CURDATE() + INTERVAL 1 DAY | CURDATE() 返回 'YYYY-MM-DD' |
| 昨天 | create_time >= CURDATE() - INTERVAL 1 DAY AND create_time < CURDATE() | |
| 本週(週一開始) | create_time >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) AND create_time < DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) + INTERVAL 7 DAY | WEEKDAY() 週一=0 |
| 上週 | create_time >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE())+7 DAY) AND create_time < DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) | |
| 本月 | create_time >= DATE_FORMAT(CURDATE(), '%Y-%m-01') AND create_time < DATE_FORMAT(CURDATE(), '%Y-%m-01') + INTERVAL 1 MONTH | 首日 00:00:00 |
| 上月 | create_time >= DATE_FORMAT(CURDATE() - INTERVAL 1 MONTH, '%Y-%m-01') AND create_time < DATE_FORMAT(CURDATE(), '%Y-%m-01') | |
| 最近 N 天 | create_time >= DATE_SUB(CURDATE(), INTERVAL N DAY) | 包含今天 |
| 最近 N 秒/分鐘/小時 | create_time >= DATE_SUB(NOW(), INTERVAL N SECOND/MINUTE/HOUR) | 精確到秒級 |
在應用代碼中計算好起止時間,直接傳參:
-- PHP 示例
$start = date('Y-m-d 00:00:00');
$end = date('Y-m-d 23:59:59');
$sql = "SELECT * FROM orders WHERE create_time BETWEEN '$start' AND '$end'";
優勢:
-- 今天
WHERE create_time >= UNIX_TIMESTAMP(CURDATE())
AND create_time < UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY)
-- 最近 30 秒
WHERE UNIX_TIMESTAMP(NOW()) - create_time <= 30
-- 按月分區表,優化器自動分區裁剪
WHERE create_time >= '2024-01-01' AND create_time < '2024-02-01'
-- 測試表:1000 萬行,create_time 有索引
EXPLAIN SELECT * FROM logs WHERE DATE(create_time) = CURDATE(); -- type=ALL 全表掃描
EXPLAIN SELECT * FROM logs WHERE create_time >= CURDATE() AND create_time < CURDATE()+INTERVAL 1 DAY; -- type=range 索引範圍掃描
列 >= 起始值 AND 列 < 結束值 區間形式ANALYZE TABLE 更新統計信息正確的時間範圍查詢寫法,是發揮索引效能的關鍵。