2017-12-17 14 views
0

실험의 일부로이 쿼리를 최적화하려고하는데이 예제에서는 MySql에서 제공하는 [The Employee database] [1]을 사용하고 있습니다. 이론 텍스트에서는 WHERE 절에 사용 된 열에서이 작업을 수행하는 것이 좋기 때문에 birth_date 특성에 보조 인덱스를 만드는 방법을 사용하고 있습니다.MySQL -이 경우 보조 인덱스가이 쿼리의 시간을 단축하지 않는 이유는 무엇입니까?

이러한 인덱스를 만들면 적어도 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; 

결과 :

보조 인덱스 없음 :

시간 평균 촬영 : 평균 촬영

CREATE INDEX myIndex2 ON employees(birth_date); 

시간 : 보조 인덱스를 생성 한 후 0.728 초

0.731 초

답변

2

birth_date의 원시 열 값을 사용하는 이 아닌입니다. 그래야만 색인을 사용할 수 있습니다. year()과 같은 기능을 사용할 때 색인은 쓸모가 없습니다.

꽤 괜찮 위르겐 d 개입니다
where birth_date >= '1953-01-01' 
    and birth_date < '1954-01-01' 
+0

, 큰 감사 : 대신이 작업을 수행 할 수

인덱스의 사용을 만들려면 – josel82