MySQL - 为什么在这种情况下,辅助索引不会减少此查询的时间?

问题描述 投票:0回答:1

作为实验的一部分,我正在尝试优化此查询,对于此示例,我使用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秒

mysql database indexing query-optimization
1个回答
2
投票

您没有使用birth_date的原始列值。只有这样才能使用索引。当使用像year()这样的函数索引是没用的。

要使用索引,您可以这样做:

where birth_date >= '1953-01-01'
  and birth_date <  '1954-01-01' 
© www.soinside.com 2019 - 2024. All rights reserved.