使用索引進行日期和時間查詢
許多真實世界的資料庫表都有很多行,其中 DATETIME
或者 TIMESTAMP
列值跨越很多時間,包括數年甚至數十年。通常需要使用 WHERE
子句來檢索該時間跨度的某個子集。例如,我們可能希望從表中檢索 2016 年 9 月 1 日的行。
一種效率低下的方法是這樣的:
WHERE DATE(x) = '2016-09-01' /* slow! */
這是低效的,因為它將函式 - DATE()
- 應用於列的值。這意味著 MySQL 必須檢查 x
的每個值,並且不能使用索引。
這是一種更好的操作方法
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
這將選擇在當天任何地方的 x
的值範圍,直到但不包括 (因此 <
)第二天的午夜。
如果表在 x
列上有索引,則資料庫伺服器可以對索引執行範圍掃描。這意味著它可以快速找到 x 的第一個相關值,然後按順序掃描索引,直到找到最後一個相關值。索引範圍掃描比 DATE(x) = '2016-09-01
所需的全表掃描更有效。
不要試圖使用它,即使它看起來更有效。
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
它具有與範圍掃描相同的效率,但它將選擇值為 x
的行,正好在 2016 年 9 月 2 日午夜,這不是你想要的。