优化了哪个查询

时间:2019-01-28 13:08:18

标签: mysql

我有一个雇员表,其中有3列ID,名称,薪水,我有薪水列的索引

EXPLAIN SELECT * FROM employees WHERE salary IN (SELECT MAX(salary) FROM employees);

id  select_type   table        type    possible_keys  key     key_len  ref       rows  Extra                         
------  ------------  -----------  ------  -------------  ------  -------  ------  ------  ------------------------------
 1  PRIMARY       <subquery2>  system  (NULL)         (NULL)  (NULL)   (NULL)       1                                
 1  PRIMARY       employees    ALL     test           (NULL)  (NULL)   (NULL)       5  Using where                   
 2  MATERIALIZED  (NULL)       (NULL)  (NULL)         (NULL)  (NULL)   (NULL)  (NULL)  Select tables optimized away 



EXPLAIN SELECT * FROM employees  INNER JOIN (SELECT  MAX(salary) AS mx FROM employees) AS tbl ON tbl.mx=employees.salary;

id  select_type  table       type    possible_keys  key     key_len  ref       rows  Extra                         
------  -----------  ----------  ------  -------------  ------  -------  ------  ------  ------------------------------
 1  PRIMARY      <derived2>  system  (NULL)         (NULL)  (NULL)   (NULL)       1                                
 1  PRIMARY      employees   ALL     test           (NULL)  (NULL)   (NULL)       5  Using where                   
 2  DERIVED      (NULL)      (NULL)  (NULL)         (NULL)  (NULL)   (NULL)  (NULL)  Select tables optimized away  

使用哪种材料是经过优化的还是DERIVED的,因为MySQL需要子查询结果,所以它将结果具体化为临时表。

并且“派生表”也是一个临时表,因此其中一个已优化?为什么?

先谢谢您

1 个答案:

答案 0 :(得分:1)

两者的性能相同。 MySQL将第一个查询转换为第二个查询。

Select tables optimized away意味着MySQL可以“采取捷径”而不读取实际表(SELECT MIN(indexed_field))。

在此计划中,对employees进行了全面扫描,可能是因为它只有5行。您应该添加更多行(以及不同的薪水)以查看实际发生的情况。