Index
mysql 5.6 沒有為確定性函式 DATEDIFF 引用索引
我不明白為什麼 MySQL 不使用索引進行以下查詢。
我有一個名為的表
users
,它的創建表是此表包含數據。
現在我正在執行 SQL 選擇語句,它正在檢查它的查詢執行計劃。
對於聲明
desc select * from users where users.created_at between '2019-05-04' and '2019-05-06';
但我使用
DateDiff
的函式查詢沒有使用索引。desc select * from users where DATEDIFF(users.created_at,'2019-05-05 23:11:56.547') = 0;
根據 MySQL 文件頁面“一個函式是不確定的,如果給定其參數的固定值,它可以為不同的呼叫返回不同的結果”。
根據doc,
DateDiff
是一個確定性函式,我不明白為什麼 MySQL 不為查詢獲取索引。
未使用索引的原因是表列是函式的輸入部分。目前 SQL 查詢
select * from users where DATEDIFF(users.created_at,'2019-05-05 23:11:56.547') = 0;
如果查詢採用以下方式,將使用索引
select * from users where users.created_at = DATE_ADD('2019-05-05 23:11:56.547', INTERVAL 0 DAY);
因為上面指的是一個時間點。要檢查日期,我們必須使用從今天開始的範圍時間戳開始明天開始,
select * from users where users.created_at between DATE_ADD('2019-05-05 ', INTERVAL 0 DAY) and DATE_ADD('2019-05-05 ', INTERVAL 1 DAY);