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 - 为啥在这种情况下二级索引不会减少此查询的时间?的主要内容,如果未能解决你的问题,请参考以下文章

mysql不等于走索引吗

有Mysql数据库的情况下为啥要用Hive数据库

mysql:在这种情况下索引多列的最佳方法是啥

MySQL Index--Change Buffer

为啥有关MongoDB采用B树索引,以及Mysql B+树做索引

索引索引下推