MySQL - 为啥在这种情况下二级索引不会减少此查询的时间?
Posted
技术标签:
【中文标题】MySQL - 为啥在这种情况下二级索引不会减少此查询的时间?【英文标题】:MySQL - Why in this case a secondary index doesn't reduce the time of this query?MySQL - 为什么在这种情况下二级索引不会减少此查询的时间? 【发布时间】:2017-12-17 11:05:14 【问题描述】:作为实验的一部分,我正在尝试优化此查询,在此示例中,我使用的是 mysql 提供的 [员工数据库][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 秒
【问题讨论】:
【参考方案1】:您没有使用birth_date
的原始列值。只有这样才能使用索引。当使用像year()
这样的函数时,索引是没用的。
要使用索引,您可以这样做:
where birth_date >= '1953-01-01'
and birth_date < '1954-01-01'
【讨论】:
以上是关于MySQL - 为啥在这种情况下二级索引不会减少此查询的时间?的主要内容,如果未能解决你的问题,请参考以下文章