繁体   English   中英

使用临时和Filesort从查询执行中删除

[英]Remove using temporary and Filesort from query execution

我有一张表几乎有90列,并且还使用了Range Partition。 该表有近50lacs记录。 那时我在Query中使用GROUP BY时,它在explain语句中显示“使用临时”和“文件排序”。

查询:

 SELECT
 subscribe_time * 0.000001 AS start_date,
 subscribe_time * 0.000001 AS end_date,
 (
    IFNULL(
      ROUND(
         SUM(
          CASE WHEN(
              subscribe_duration > 20000 AND subscribe_status = '1'
              ) THEN 1 ELSE 0
          END
          ) /(
            SUM(
              CASE WHEN(subscribe_status = '1') THEN 1 ELSE 0
              END
           )
      ) * 100,
    2
  ),
  0
)
) AS subscribe_avg

FROM
  tbl_subscription a
WHERE
  1 AND subscribe_time > 0 AND subscribe_time BETWEEN "1525113000000000" AND "1524680999999999"
GROUP BY
  EXTRACT(
    YEAR
    FROM
       FROM_UNIXTIME(subscribe_time * 0.000001)
    ),
  EXTRACT(
    MONTH
    FROM
    FROM_UNIXTIME(subscribe_time * 0.000001)
  ),
  EXTRACT(
     WEEK
     FROM
     FROM_UNIXTIME(subscribe_time * 0.000001)
 ),
 EXTRACT(
   DAY
   FROM
   FROM_UNIXTIME(subscribe_time * 0.000001)
),
sub_user,
subscribe_ip,
subscribe_zone,
subscribe_approval

索引已在field1上给出。 field1不是我们的PK。 总共给出了5列的索引。

当我写GROUP BY查询时,花了将近43秒才能执行。 当我当时删除GROUP BY时,执行时间为0.27秒。

同样,当我们最后写入“ ORDER BY NULL ”时,文件排序也将被删除。 但是我不想在查询中使用ORDER BY 如何减少查询执行时间?

另外,我也尝试从单个分区中获取数据,但是查询仍然花费相同的时间。 查询以从单个分区获取数据:

 SELECT field1, field2 FROM TABLE_NAME PARTITION(p1) WHERE 1 AND 
   field1='SOME_VALUE' GROUP BY field1;

提供一些建议以减少查询执行时间。

GROUP BY的第一个表达式可以替换为

subscribe_time

也许

FLOOR(subscribe_time * 0.000001)

我认为不必为了GROUP BY而将其分解。

您可以提供SHOW CREATE TABLE吗? -我们需要查看索引,分区以及其他可能的细节。 特别是,它是否具有以下一项或两项:

PARTITION BY RANGE(subscribe_time)
INDEX(subscribe_time)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM