(Мой) вопрос по оптимизации SQL - PullRequest
0 голосов
/ 04 августа 2011

У меня есть 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 записей.

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Простой запрос для оптимизации,

Таблица сотрудников. Имеет два столбца, например id Totalmarks (из 900) 1 700 2 600.,,,n.

SELECT * FROM Employee WHERE Totalmarks BETWEEN 300 AND 600

потребуется несколько секунд для выполнения запроса.

но

ALTER TABLE Totalmarks ADD INDEX ( Totalmarks  );
SELECT * FROM Employee  WHERE Totalmarks BETWEEN 300 AND 600;
0 голосов
/ 04 августа 2011

Уникальный индекс в таблице kw нельзя использовать, потому что в предложении where у вас нет adgroupid. создать индекс по клиенте, день

0 голосов
/ 04 августа 2011

Я бы пошел еще дальше ... У клиента может быть много кампаний, поэтому ваш индекс должен сначала соответствовать самым маленьким критериям. У меня был бы индекс на

( CampaignID, ClientId, Day )

тогда просто для того, чтобы ухмылки соответствовали ожидаемому индексу для оптимизации, просто измените предложение WHERE на

WHERE
         kw.campaignid = '23213231232'
      AND kw.clientid = '$clientid'
      AND kw.`day` BETWEEN '2011-07-31' AND '2011-07-01'
      AND ( kw.adid = '' OR kw.adid = '0')
0 голосов
/ 04 августа 2011

похоже, вам нужны индексы для клиентов и / или для кампаний. жестко без подробностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...