В рамках эксперимента я пытаюсь оптимизировать этот запрос, и для этого примера я использую [База данных сотрудников] [1], предоставленную MySql. Стратегия, которую я использую, заключается в создании вторичного индекса атрибута birth_date, поскольку теоретические тексты рекомендуют делать это в столбцах, которые используются в предложении WHERE.
Создав такой индекс, я ожидал сокращения времени не менее 40%, но это не так с этим запросом. По-видимому, вовремя не улучшилось, на самом деле в среднем это занимает немного больше времени. Может ли кто-нибудь сказать мне, почему это происходит?
SELECT employees.emp_no,
employees.departments.dept_name,
employees.first_name,
employees.last_name,
employees.birth_date,
year(curdate()) - year(birth_date) AS yearsOld
FROM employees.employees
INNER JOIN employees.dept_emp ON employees.dept_emp.emp_no = employees.emp_no
INNER JOIN employees.departments ON employees.departments.dept_no = employees.dept_emp.dept_no
WHERE year (birth_date) < 1953
ORDER BY emp_no ASC;
Результаты:
Без вторичного индекса:
Среднее время: 0,728 с
После создания вторичного индекса:
CREATE INDEX myIndex2 ON employees(birth_date);
Среднее время: 0,731 с
Вы не используете исходное значение столбца birth_date
. Только тогда можно использовать индекс. При использовании функции типа year()
индексы бесполезны.
Чтобы использовать индекс, вы можете сделать это вместо этого:
where birth_date >= '1953-01-01'
and birth_date < '1954-01-01'