从查询执行中删除 using temporary 和 Filesort

Posted

技术标签:

【中文标题】从查询执行中删除 using temporary 和 Filesort【英文标题】:Remove using temporary and Filesort from query execution 【发布时间】:2018-05-30 05:45:10 【问题描述】:

我有一张表,有近 90 列,并且还使用了范围分区。该表有近 50 条 lacs 记录。当我当时在查询中使用GROUP BY 时,它在解释语句中显示“使用临时”和“文件排序”。

查询:

 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;

提出一些减少查询执行时间的建议。

【问题讨论】:

您的第一个查询对我来说毫无意义。如果只限制一个值,为什么要按field1 分组?此外,在该查询中选择 field2 很可能是无效的(尽管它可能mysql 中运行,但遗憾的是)。请在您的问题中添加问题陈述以及一些示例数据。 感谢您的回复。实际上,我在 SELECT 语句中进行算术运算,这就是使用 GROUP BY 的原因。我的实际查询有一些算术运算,但我没有在这里列出。 那我建议你向我们展示真正的问题。 把你的例子放在这里db-fiddle.com并发布它。 在实际问题中添加了我的查询。实际上,GROUP BY 列太多了。 【参考方案1】:

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

subscribe_time

或许

FLOOR(subscribe_time * 0.000001)

我认为没有必要仅仅为了做GROUP BY而把它拆开。

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

PARTITION BY RANGE(subscribe_time)
INDEX(subscribe_time)

【讨论】:

以上是关于从查询执行中删除 using temporary 和 Filesort的主要内容,如果未能解决你的问题,请参考以下文章

优化查询,去掉“Using where;Using temporary;Using filesort”

EXPLAIN sql优化方法 Using temporary ; Using filesort

EXPLAIN sql优化方法 Using temporary ; Using filesort

使用 Using temporary 解释 mysql 性能中的计划;使用文件排序;使用索引条件

mysql using filesort Using temporary

Using temporary和Using filesort分析