作为实验的一部分,我正在尝试优化此查询,对于此示例,我使用的是MySql提供的[Employee数据库] [1]。我正在使用的策略是在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秒
答案 0 :(得分:2)
您使用birth_date
的原始列值不。只有这样才能使用索引。使用像year()
这样的函数时,索引是无用的。
要使用索引,您可以改为:
where birth_date >= '1953-01-01'
and birth_date < '1954-01-01'