使用索引進行日期和時間查詢

許多真實世界的資料庫表都有很多行,其中 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 日午夜,這不是你想要的。