我有这种形式的MySQL查询:SELECT中的子查询或JOIN中的子查询?
SELECT
employee.name,
totalpayments.totalpaid
FROM
employee
JOIN (
SELECT
paychecks.employee_id,
SUM(paychecks.amount) totalpaid
FROM
paychecks
GROUP BY
paychecks.employee_id
) totalpayments on totalpayments.employee_id = employee.id
我最近发现,它返回快得多这种形式:
SELECT
employee.name,
(
SELECT
SUM(paychecks.amount)
FROM
paychecks
WHERE
paychecks.employee_id = employee.id
) totalpaid
FROM
employee
我很惊讶会有的速度差,并且较低的查询会更快。我更喜欢开发的上层表单,因为我可以独立运行子查询。
有没有办法获得“两全其美”:快速结果返回并能够独立运行子查询?
非常感谢,spencer7593!我可以尝试在派生表上强制索引吗? (我不太熟悉索引或创建它们的语法。) – 2015-02-11 17:26:40
@YossiFendel:我不相信在派生表上创建索引有任何提示。这只会在版本5.6和更高版本中发生。 EXPLAIN输出应显示正在使用哪种连接操作。通过完全避免子查询可能获得最佳性能。我在编辑答案时提供了一个示例。 – spencer7593 2015-02-11 17:31:42
@YossiFendel:另一个选项是创建一个临时表(带索引)作为子查询的结果,然后在第二个查询中引用该临时表。这很麻烦,但它可以提高性能,特别是当多个查询中引用相同的内联视图时......因为我们避免了多次实现它。 – spencer7593 2015-02-11 17:36:42