我有一个雇员表,其中有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需要子查询结果,所以它将结果具体化为临时表。
并且“派生表”也是一个临时表,因此其中一个已优化?为什么?
先谢谢您
答案 0 :(得分:1)
两者的性能相同。 MySQL将第一个查询转换为第二个查询。
Select tables optimized away
意味着MySQL可以“采取捷径”而不读取实际表(SELECT MIN(indexed_field)
)。
在此计划中,对employees
进行了全面扫描,可能是因为它只有5行。您应该添加更多行(以及不同的薪水)以查看实际发生的情况。