优化查询以外的子选择

时间:2013-09-06 03:22:36

标签: mysql query-optimization

我有一个MySQL查询,可以从不同的表中选择不同的数据来构建报告。例如:

SELECT
  u.id,
  u.first_name,
  u.last_name,
  (select count(*) from monkeys where owner_id = u.id) as pet_monkeys,
  ((select count(*) from speeding_tickets where owner_id = u.id) + (select count(*) from parking_tickets where owner_id = u.id)) as moving_violations,
FROM
  user as u
WHERE
  u.id = 12345

在实际代码中,大约有20个子选择从不同的表中提取统计数据。这个查询也是昙花一现。

是否有更好的方法可以使用JOIN或UNION或其他东西组织上述查询?

1 个答案:

答案 0 :(得分:0)

在这种情况下,它们都链接回同一个表用户,您可以将它们连接在一起进行分组和计数,这样会快得多。还要确保你已经建立了正确的索引

 SELECT
  u.id,
  max(u.first_name),
  max(u.last_name),
  count(m.owner_id) as pet_monkeys,
  count(s.owner_id) + count(p.owner_id) as moving_violations
FROM
  user as u, monkeys m, speeding_tickets s, parking_tickets p
WHERE
  u.id = 12345 and
  u.id = m.owner_id and
  u.id = p.owner_id and
  u.id = s.owner_id
GROUP BY u.id