MySQL - Почему в этом случае вторичный индекс не сокращает время этого запроса?

0

В рамках эксперимента я пытаюсь оптимизировать этот запрос, и для этого примера я использую [База данных сотрудников] [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 с

Теги:
database
indexing
query-optimization

1 ответ

2
Лучший ответ

Вы не используете исходное значение столбца birth_date. Только тогда можно использовать индекс. При использовании функции типа year() индексы бесполезны.

Чтобы использовать индекс, вы можете сделать это вместо этого:

where birth_date >= '1953-01-01'
  and birth_date <  '1954-01-01' 
  • 0
    Это совершенно верно Юрген д, большое спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню