mysql - 从查询执行中删除使用临时和文件排序

标签 mysql group-by partitioning temp-tables filesort

我有一个表,有近 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;

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

最佳答案

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

subscribe_time

或者也许

FLOOR(subscribe_time * 0.000001)

我认为没有必要将其分解只是为了执行GROUP BY

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

PARTITION BY RANGE(subscribe_time)
INDEX(subscribe_time)

关于mysql - 从查询执行中删除使用临时和文件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50597122/

相关文章:

php mysql查询动态按值分组

mysql - INET_ATON - mysql 查询到 ms-sql 查询

服务器重启后mysql运行存储过程

mysql - 没有完全正确地获取 SQLQuery - 双重信息

sql - MySQL:分组依据和 IF 语句

mysql - SELECT 查询的分组问题

PostgreSQL 在 Group By + In Statement 查询中返回额外的排序

oracle - ORA 00904 带有左/右外连接的标识符无效

java - 虽然我实现的快速排序方法适用于整数和字符串数组,但此方法不适用于汽车数组

java - 在 Hadoop Map-Reduce 中,是否有任何类在排序之后和分区之前看到整个键列表?