2014-04-23 36 views
0

请参阅下面我想要优化的mysql查询。我确信有这样做的更有效的方式,但我只是不能为我的生活工作。有人可以帮忙吗?我认为必须有一种方法来防止每个组的多个内部联接。SQL查询 - 计数组非常慢 - 帮助优化

SELECT network_name, count(*) as phone_count from 
deals_temp d 
     INNER JOIN phones p ON d.model_id = p.model_id 
     INNER JOIN tariffs t ON d.tariff_id = t.tariff_id 
     INNER JOIN networks n ON d.network_id = n.network_id 
     INNER JOIN free_gift fg ON d.freegift_id = fg.freegift_id 
     INNER JOIN merchants m ON d.merchant_id = m.merchant_id 
     INNER JOIN type ty ON ty.type_id = d.type_id 
WHERE network_name != '' GROUP BY network_name UNION ALL 

SELECT tariff_contractlength, count(*) as phone_count from 
deals_temp d 
     INNER JOIN phones p ON d.model_id = p.model_id 
     INNER JOIN tariffs t ON d.tariff_id = t.tariff_id 
     INNER JOIN networks n ON d.network_id = n.network_id 
     INNER JOIN free_gift fg ON d.freegift_id = fg.freegift_id 
     INNER JOIN merchants m ON d.merchant_id = m.merchant_id 
     INNER JOIN type ty ON ty.type_id = d.type_id 
WHERE tariff_contractlength != 1 GROUP BY tariff_contractlength UNION ALL 

SELECT offer_freegift, count(*) as phone_count from deals_temp d 
     INNER JOIN phones p ON d.model_id = p.model_id 
     INNER JOIN tariffs t ON d.tariff_id = t.tariff_id 
     INNER JOIN networks n ON d.network_id = n.network_id 
     INNER JOIN free_gift fg ON d.freegift_id = fg.freegift_id 
     INNER JOIN merchants m ON d.merchant_id = m.merchant_id 
     INNER JOIN type ty ON ty.type_id = d.type_id 
WHERE offer_freegift != '' GROUP BY offer_freegift 

好吧我会解释一些,简单地说。我认为这可能很快。

所以,我有以下表

deals_temp

MODEL_ID | tariff_id |

123 | 1234

123 | 1235

123 | 1236

124 | 1237

手机

MODEL_ID | model_make | model_basename

123 | Apple | iPhone

124 | Apple | iPad的

关税

tariff_id |资料名称

1234 |无限30

我需要根据其他表中的不同值计算deals_temp中的交易数(行数),例如,电话(model_make)和资费(tariff_name)

输出应为:

元件|计数

iPhone | 123

iPad | 543

Apple | 453

无限30 | 564

+0

你为什么要数(*)?你不能只计算每行的唯一ID吗? – Morgan

+1

就像我们知道你有什么数据,什么表结构和预期输出一样。您认为我们应该如何帮助您提供您提供的信息? –

+0

非常好,由@juergend +1表示。 – Rahul

回答

0

第一步是确保您在内部加入的所有ID字段上都有索引。

第二步是确保您在where子句中引用的变量索引。 (network_name,tariff_contractlength,offer_freegift)

除此之外,当你拿走工会时,你有一些非常直接的问题,这意味着他们看起来并不复杂。

不确定mySQL是否有查询优化器,您可以查看,但这将是一个开始的地方。我从查看查询的猜测是,大部分时间都花在了加入数据上,这意味着要么不需要加入太多数据,要么加强服务器统计数据,要么开始构建多维数据集.....(我不会推荐最后两个)

+0

感谢您的回复。所有的连接字段都设置为主键,所以我认为它们自然会被编入索引?这就是这篇文章的原因,我想知道是否有办法停止所有多个连接,并且只有一次连接,然后从该表中完成计数。唯一想到的就是你如何创建一个多维数据集/新表,所以我可以在每个查询中引用它。任何人有更多想法?在一个查询中有更简单的方法吗? –