我有一个表,它几乎有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;
给出一些减少查询执行时间的建议。
1条答案
按热度按时间xqk2d5yq1#
第一个表达式
GROUP BY
可能会被或者也许
我觉得没必要为了完成任务就把它拆开
GROUP BY
.你能提供吗
SHOW CREATE TABLE
? - 我们需要查看索引、分区以及其他细节。特别是,它是否有以下两种情况