【发布时间】:2018-05-02 13:51:40
【问题描述】:
我有一个SQL,执行时间超过一分钟,这对我来说太多了,谁能提供优化建议。
UPDATE 2 - 随着速度的增加稍微修改了 sql:
SELECT STRAIGHT_JOIN
kw.`id` , kw.`clientid` , kw.`day` , kw.`campaignid` , kw.`campaign` , kw.`adgroupid`, kw.`adgroup` , kw.`matchtype` ,
kw.`firstpagecpc` , kw.`keywordtext` , kw.`qualityscore` , kw.`maxcpc` , kw.`avgcpm` , kw.`status` , kw.`keywordtext` ,
kw.`matchtype` ,
SUM( kw.`impressions` ) AS impressions,
SUM( kw.`clicks` ) AS clicks,
SUM( kw.`impressions` * kw.`avgposition` ) / SUM( kw.`impressions` ) AS avgposition,
SUM( kw.`cost` ) AS cost,
(SUM( kw.`clicks` ) / SUM( kw.`impressions` ) *100) AS ctr,
(SUM( kw.`cost` ) / SUM( kw.`clicks` )) AS avgcpc,
IF(kw.maxcpc = 0,kw.maxcpc,ad.defaultmaxcpc) AS maxcpc
FROM `keywordsreport` AS kw
JOIN `adgroupreport` AS ad
ON (kw.clientid = ad.clientid AND kw.`day` = ad.day)
WHERE
kw.`campaignid` = '55347673'
AND kw.`clientid` = '6588826821'
AND kw.`day` BETWEEN '2011-07-01' AND '2011-07-31'
AND (kw.`adid` = '' OR kw.`adid` = '0')
GROUP BY kw.`keywordtext`, kw.`matchtype`
keywordsreport 表索引:
PRIMARY PRIMARY 235232 id
Unique UNIQUE 235232 adgroupid
day
keywordtext
matchtype
adid
INDEX INDEX 16802 keywordtext
matchtype
clientid
CLIENTIDDAY INDEX 6637 clientid
day
adgroupreport 表索引:
PRIMARY PRIMARY 1328238 id
CLIENTIDDAY INDEX 6447 clientid
day
更新 3: 带有 EXPLAIN 的示例查询:
i select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE kw range CLIENTID,CLIENTIDDAY,ADIDDAY,CAMPAIGNCLIENTDAY CAMPAIGNCLIENTDAY 211 NULL 350 Using where; Using temporary; Using filesort
1 SIMPLE ad range CLIENTIDDAY CLIENTIDDAY 65 NULL 42464 Using where
在每个表中:keywordsreport 和 adgroupreport 可能有 ~ 1 000 000 条记录。
【问题讨论】:
-
每张表有多少行? addid 为 0 或 null 的行数有多少?每个campaignid 有多少行?
-
尝试将
EXPLAIN放在查询前面,然后在此处发布结果 -
如果不加入
adgroupreport并选择maxcpc,此查询的运行速度是否快 50%? -
不加入运行速度快10-15倍,速度可以接受。但是用什么代替加入呢?
-
正如我在更新 1 中提到的,每个表中可能有 ~ 1 000 000 行。
标签: mysql sql optimization indexing