【发布时间】:2015-10-07 14:48:39
【问题描述】:
我不是 SQL 专家,因此我试图了解为什么两个查询的执行时间大不相同。
common_stats 是一个大表(300 万行)。我只是想了解为什么会出现巨大的性能差异。
以下查询大约需要 15 秒:
select distinct cs.basesalary_id
from common_stats AS cs
LEFT JOIN basesalary AS b ON b.id = cs.basesalary_id
WHERE (b.employee_id= 100 AND cs.amount > 0 AND cs.pay_id is null );
此查询需要 ~.1 秒:
select distinct basesalary_id from (
select cs.basesalary_id, cs.pay_id
from common_stats AS cs
LEFT JOIN basesalary AS b ON b.id = cs.basesalary_id
WHERE (b.employee_id= 100 AND cs.amount > 0)
) as temp
where pay_id is null;
【问题讨论】:
-
您是否尝试过将
explain放在查询前面并比较执行计划? -
@e4c5 但是这个例子是一个子查询,它的性能明显优于连接。
-
@Phylogenesis 哦,对不起,我看错了!
-
始终使用
EXPLAIN(并在此处发布其输出)。如果您有两个对相同数据进行操作的查询,请始终确保您不会通过发出RESET QUERY CACHE;来从查询缓存中提取数据。要记住的另一件非常非常重要的事情 - 您可以将 SQL 优化到无限甚至更远,但硬件起着非常重要的作用。了解您正在使用的引擎以及它是否以最佳方式使用您的硬件非常重要。
标签: mysql performance subquery left-join