SQL(mysql)查询改进

时间:2012-09-04 23:00:15

标签: mysql sql performance

首先,让我解释一下我的数据结构。

我有一个名为profile的模型,witch是服务提供商的配置文件。服务提供商可以从两种不同类型的“旅行”中选择(两者都没有,也没有)。第一种旅行模式是“我可以去客户”。为此,服务提供商需要输入他可以旅行的所有城市(多对多)。第二个“旅行”模式是“我的客户可以来找我”。那些,他从列表中选择了他所在的城市(一对多)。

对于“我可以进入客户端”旅行模式,我有一个带有profile_id的locals_profile表和一个带有城市名称的local_id和一个locals表。

对于“我的客户可以来找我”,我有一个包含profile_id和city_id的位置表以及一个包含城市名称的城市表。

在你问之前,由于项目建模中的其他事情,我在两种情况下都不能使用同一个表作为城市名称(如果可以的话,性能会提高吗?)。

此外,该配置文件属于许多sub_categories,为我们带来另一个名为profiles_sub_categories的表,其中包含sub_category_id和profile_id字段。

我想要的是,给定一个sub_category,显示我在每个城市有多少项目。例如:

  • 对于“设计师”子类别:
    • 纽约(100)
    • San Fracisco(50)
    • 迈阿密(10)
    • ...(最多10个城市)

我通过以下查询完成了我想要的内容:

select q1.city_name, if(q1.city_count is null, 0, q1.city_count) + if(q2.city_count is null, 0, q2.city_count) city_count
from
  (select l.name as city_name, count(*) as city_count from locals_profiles lp
  inner join locals l on l.id = lp.local_id
  inner join profiles p on p.id = lp.profile_id
  inner join profiles_sub_categories ps on ps.profile_id = p.id
  where ps.sub_category_id = 97 and l.level = 2
  group by 1) q1
left join
  (select c.name as city_name, count(*) as city_count from cities c
  inner join locations lo on lo.city_id = c.id
  inner join profiles p on lo.profile_id = p.id
  inner join profiles_sub_categories ps on ps.profile_id = p.id
  where ps.sub_category_id = 97
  group by 1) q2
on q1.city_name = q2.city_name
order by 2 DESC
limit 10;

但查询执行时间太长。由于它是一个Web应用程序,我需要几乎立即。有谁知道更好的方法来做我正在尝试的事情?

1 个答案:

答案 0 :(得分:0)

我发现mysql在优化查询方面做得不好。简单的解决方案是编写两个查询并将它们合并到应用程序层中。令人惊讶的是,它可能会更快......

或者,您可以尝试消除视图(q1,q2)并多次别名相同的表。可能很难做对......