У меня есть SQL, выполнение которого занимает больше минуты, что для меня слишком много, может кто-нибудь дать совет по оптимизации.
ОБНОВЛЕНИЕ 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`
индексы таблицы отчетов по ключевым словам:
PRIMARY PRIMARY 235232 id
Unique UNIQUE 235232 adgroupid
day
keywordtext
matchtype
adid
INDEX INDEX 16802 keywordtext
matchtype
clientid
CLIENTIDDAY INDEX 6637 clientid
day
индексы таблицы отчетов по группам:
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
В каждой таблице: ключевые слова отчета и группы объявлений может быть ~ 1 000 000 записей.