Index

mysql 5.6 沒有為確定性函式 DATEDIFF 引用索引

  • May 14, 2019

我不明白為什麼 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 文件頁面“一個函式是不確定的,如果給定其參數的固定值,它可以為不同的呼叫返回不同的結果”。

根據docDateDiff是一個確定性函式,我不明白為什麼 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);

引用自:https://dba.stackexchange.com/questions/237441