2017-12-17 8 views
0

私はこのクエリを最適化しようとしています。この例では、MySqlが提供する[The Employee database] [1]を使用しています。私が使用している戦略は、WHERE句で使用されている列についてこれを行うことを理論テキストが推奨しているため、birth_date属性の2次インデックスを作成することです。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()のような関数を使用する場合、インデックスは役に立たない。あなたの代わりにこれを行うことができ、インデックスを利用すること

where birth_date >= '1953-01-01' 
    and birth_date < '1954-01-01' 
+0

ユルゲンdのかなり右である、大きな感謝 – josel82

関連する問題