Это зависит от того, какую версию вы используете.
Старая версия: INDEX(from_date, emp_no, salary)
"покрывает" и будет выполнять "диапазонное" сканирование части индекса.Однако GROUP BY
, вероятно, будет включать сортировку.
Более новая версия: INDEX(emp_no, from_date, salary)
также "покрывает", но может перемещаться по индексу, не касаясь каждой строки.Вероятно, этого можно избежать.
Вот еще одна вещь для проверки:
SELECT emp_no,
( SELECT SUM(salary) FROM salaries
WHERE emp_no = e.emp_no
AND from_date < '...')
FROM employees AS e
Примечание: я предполагаю, что employees
имеет одну строку на сотрудника, в отличие от salaries
??Этот подход позволяет избежать GROUP BY
, но имеет издержки коррелированного подзапроса.Теперь salaries
требуется INDEX(emp_no, from_date, salary)
- в этом порядке, и каждый раз выполняется сканирование меньшего диапазона в индексе.