使用temporary和filesort从查询执行中删除

lhcgjxsq  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(381)

我有一个表,它几乎有90列,还使用范围分区。这张表有近50条记录。当我使用 GROUP BY 在当时的查询中,它在explain语句中显示“using temporary”和“filesort”。
查询:

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

字段1上已给出索引。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;

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

xqk2d5yq

xqk2d5yq1#

第一个表达式 GROUP BY 可能会被

subscribe_time

或者也许

FLOOR(subscribe_time * 0.000001)

我觉得没必要为了完成任务就把它拆开 GROUP BY .
你能提供吗 SHOW CREATE TABLE ? - 我们需要查看索引、分区以及其他细节。特别是,它是否有以下两种情况

PARTITION BY RANGE(subscribe_time)
INDEX(subscribe_time)

相关问题