SQL查询 - 计数组非常慢 - 帮助优化

时间:2014-04-23 22:38:04

标签: mysql

请参阅下面我想要优化的mysql查询。我确信有一种更有效的方法可以做到这一点,但我只是因为我的生活无法解决这个问题。有人可以帮忙吗?我认为必须有一种方法来阻止每个组的多个内连接。

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 | tariff_name

1234 |无限制30

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

输出应为:

元素|计数

iPhone | 123

iPad | 543

Apple | 453

无限制30 | 564

1 个答案:

答案 0 :(得分:0)

第一步是确保你内部加入的所有id字段都有索引。

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

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

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