>我有一个表,有近 90 列,并且还在其上使用范围分区。此表有近 50lacs 记录。当我当时在查询中使用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
字段1 上已经给出了索引。字段 1 不是我们的 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)