Mysql 查询占用太多时间,性能不佳 我的查询需要很长时间,大约1小时 这会影响数据库的性能。 即使是解释计划也需要很长时间。 请重写查询以获得最佳性能。
查询:Mysql 查询占用太多时间,性能不佳 我的查询需要很长时间,大约1小时 这会影响数据库的性能。 即使是解释计划也需要很长时间。 请重写查询以获得最佳性能。,mysql,sql,query-performance,Mysql,Sql,Query Performance,查询: SELECT Count(*) FROM (SELECT paid.keyword_id, paid.keyword_name, stat.orgentrances, keyword.rank1, keyword.rank_check, Sum(paid.clicks)
SELECT Count(*)
FROM (SELECT paid.keyword_id,
paid.keyword_name,
stat.orgentrances,
keyword.rank1,
keyword.rank_check,
Sum(paid.clicks) AS sumclick,
Sum(paid.clicks * paid.avg_position) AS
sumclickavgpos,
Sum(paid.itemrevenue) AS sumitem,
Sum(paid.cost) AS sumcost,
Sum(paid.transactions) AS sumtrans,
Sum(paid.impressions) AS
sumimpress,
IF(Sum(paid.impressions) = 0, 0, Sum(
paid.impressions * paid.avg_position) / Sum
(paid.impressions)) AS
sumimpressavgrank,
con.item_revenue,
con.transactions,
keyword.monthly_search_volume
FROM `t_keyword_paid_analytics_google_ib` paid
LEFT JOIN (SELECT outer_t.keyword_id,
Sum(outer_t.item_revenue) AS item_revenue,
Sum(outer_t.transactions) AS transactions
FROM t_keyword_conversion_ga_ib outer_t
WHERE outer_t.own_domain_id = 720
AND outer_t.traffic_date >= '2012-12-01'
AND outer_t.traffic_date <= '2012-12-31'
GROUP BY outer_t.keyword_id) con
ON paid.keyword_id = con.keyword_id
LEFT JOIN (SELECT outer_t.keyword_id,
Sum(outer_t.entrances) AS orgEntrances
FROM t_keyword_stat_ga_ib outer_t
WHERE outer_t.own_domain_id = 720
AND outer_t.traffic_date >= '2012-12-01'
AND outer_t.traffic_date <= '2012-12-31'
AND ( outer_t.medium = 'organic'
OR outer_t.medium IS NULL )
GROUP BY outer_t.keyword_id) stat
ON paid.keyword_id = stat.keyword_id
LEFT JOIN `t_managed_keyword_ib` keyword
ON keyword.id = paid.keyword_id
WHERE paid.own_domain_id = 720
AND paid.traffic_date >= '2012-12-01'
AND paid.traffic_date <= '2012-12-31'
AND ( paid.channel IS NULL
OR paid.channel = 'Google' )
GROUP BY paid.keyword_id
HAVING paid.keyword_id IS NOT NULL) tempt;
(outer_t.medium = 'organic' or outer_t.medium is null ) after outer_t.own_domain_id = 720 and (paid.channel is null or paid.channel = 'Google')
after paid.own_domain_id = 720
请帮帮我。您必须在表中添加一些索引
ALTER TABLE table_name ADD UNIQUE INDEX cate_id(field_name);
这是你的电话号码
在您的情况下,我会将索引添加到:
paid.keyword_id
con.keyword_id
stat.keyword_id
keyword.id
paid.keyword_id
因为您正在对这些字段进行联接,所以您没有指示任何索引。您将需要它们来提高性能 好的,我不明白分号后面的部分,所以我忽略它 整个查询对一个子选择进行计数*,但在子查询调用SUM中进行了一系列聚合,这是数据库不必做的工作,所以消除了这一点 您可以在进一步的子查询中进行聚合,所以请不要这样做 在主子选择中,您只是在进行计数*,您选择了不在分组依据中的字段,这是对数据库的操作,不会影响计数,所以请去掉它 这让我们有点像
select count(*)
from (select paid.keyword_id
from `t_keyword_paid_analytics_google_ib` paid
left join
(select outer_t.keyword_id
from t_keyword_conversion_ga_ib outer_t
where ...
group by outer_t.keyword_id ) con
on paid.keyword_id = con.keyword_id
left join
(select outer_t.keyword_id
from t_keyword_stat_ga_ib outer_t
where ...
group by outer_t.keyword_id) stat on paid.keyword_id = stat.keyword_id
left join `t_managed_keyword_ib` keyword on keyword.id = paid.keyword_id
where ...
group by paid.keyword_id
having paid.keyword_id is not null
) tempt;
此外,计数可能比选择更快,而且您似乎在寻找关键字_id并最终计数。如果你能边走边数,那会比选择更好。我不确定您是否可以将其应用于此查询,但请记住。在此处提出具体问题,请参阅我们是否应该猜测您的查询应该做什么?如果您希望有人帮助,请至少将其正确格式化。对不起,我为我的错误道歉。请在此处帮助我。您的查询似乎进行了大量分组和求和,只是为了返回单个数字计数*。如果你只是想计算一下,不要费心做所有的计算。
select count(*)
from (select paid.keyword_id
from `t_keyword_paid_analytics_google_ib` paid
left join
(select outer_t.keyword_id
from t_keyword_conversion_ga_ib outer_t
where ...
group by outer_t.keyword_id ) con
on paid.keyword_id = con.keyword_id
left join
(select outer_t.keyword_id
from t_keyword_stat_ga_ib outer_t
where ...
group by outer_t.keyword_id) stat on paid.keyword_id = stat.keyword_id
left join `t_managed_keyword_ib` keyword on keyword.id = paid.keyword_id
where ...
group by paid.keyword_id
having paid.keyword_id is not null
) tempt;