【问题标题】:(My)SQL optimization question(My)SQL优化题
【发布时间】: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


【解决方案1】:

我会更进一步...一个客户可以有许多广告系列,因此您的索引应该首先基于最小的标准。我会有一个索引

( CampaignID, ClientId, Day )

然后只是为了让grins匹配预期的索引进行优化,只需将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')

【讨论】:

  • 试过了,没有明显增加。某些查询的速度甚至略有下降(-1 秒)。不过还是谢谢。
  • @Vitaliy:你也可以试试(CampaignID, Adid, ClientId, Day )index
【解决方案2】:

看起来您需要有关 clientid 和/或campaignid 的索引。很难没有更多细节。

【讨论】:

  • 提供更多详细信息(EXPLAIN SQL、索引、行数 - 1 000 000)。谢谢!
  • 好吧.. 客户 ID 和活动 ID 上的索引正是正确的答案。
【解决方案3】:

无法使用 kw 表中的唯一索引,因为您的 where 子句中没有 adgroupid。 在 clientid 上创建索引,day

【讨论】:

  • 插入时使用唯一索引,它也用于在 DB 层检查重复数据。创建索引,它给了一点性能提升。谢谢!
【解决方案4】:

用于优化的简单查询,

员工表 它有两列,比如 id 总分(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;

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2016-12-07
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多