请参阅下面我想要优化的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
答案 0 :(得分:0)
第一步是确保你内部加入的所有id字段都有索引。
第二步是确保在where子句中引用变量的索引。 (network_name,tariff_contractlength,offer_freegift)
除此之外,当你拿走工会时,你会有一些非常直接的疑问,这意味着他们看起来并不复杂。
不确定mySQL是否有可以查看的查询优化器,但这是一个可以开始的地方。我从查询您的查询的猜测是,大部分时间都花在加入您的数据上,这意味着要么您不需要加入这么多数据,要么加强您的服务器统计数据,或者开始构建多维数据集......(我不会推荐最后两个)