Я бы определенно использовал первый запрос, если у вас есть индекс для столбца activity_date
.
Когда вы выполняете DATE_SUB () или DATE () для константных значений, MySQL нужно только сделать этот расчет один раз, прежде чем он начинает изучать строки. Результатом выражения является константа.
Сравнение индексированного столбца МЕЖДУ двумя константными значениями, затем он может использовать этот индекс для эффективного поиска совпадающих строк, используя поиск range
.
Принимая во внимание, что если вы помещаете свой столбец в вызов DATEDIFF (), он должен пересчитать результат в каждой проверенной строке и не может использовать индекс. Он будет вынужден изучить каждую строку в таблице. Это называется сканированием таблицы.
Вы можете использовать EXPLAIN для подтверждения этого. Первый запрос покажет type: range , но второй запрос покажет type: ALL , а столбец row в EXPLAIN покажет оценку, примерно равную размер таблицы.
FWIW, это, как правило, верно: любое выражение, в которое вы помещаете столбец внутри вызова функции, портит любое преимущество индекса для этого столбца. Индексы работают, потому что они хранятся в отсортированном порядке, но MySQL не может использовать индекс для столбца внутри выражения или функции, потому что он не выполняет никакого анализа, чтобы определить, имеет ли результат выражения тот же вид порядок как сам столбец.