解决方案
30
另外,一个问题就是你说的为什么你的子查询里都没有last_name和first_name字段,但是查询计划中会用到索引。
这个问题的原因是mysql里的B树索引是基于主键的,也就是你的emp_no是主键,那么在你创建的last_name和first_name索引中,就会包含这个emp_no字段的值,而只包含这3个字段的索引,显然要比主键索引在体积上要小,所以你可以看到执行计划中type列里是index,也就是索引扫描,也就是把这个last_name和first_name 索引整个扫描了一遍,显然成本要比扫描整个表来的 要小。
所以,就会用这个看似完全没关系的索引了。
这个问题的原因是mysql里的B树索引是基于主键的,也就是你的emp_no是主键,那么在你创建的last_name和first_name索引中,就会包含这个emp_no字段的值,而只包含这3个字段的索引,显然要比主键索引在体积上要小,所以你可以看到执行计划中type列里是index,也就是索引扫描,也就是把这个last_name和first_name 索引整个扫描了一遍,显然成本要比扫描整个表来的 要小。
所以,就会用这个看似完全没关系的索引了。