接到一个 sql 优化问题,开发同学给了我 sql 语句,需要帮忙优化一下。
带出两个 sql 优化的技巧。虚拟列和 group by 优化
看下 sql 语句:了解下下背景:
-- 按时间统计,最近 1 小时,每 10 分钟间距统计
- 按时间统计,最近 7 天,每天间距统计
-- 按时间统计,最近 30 天,每天间距统计
大概知道慢在哪里了。
对时间列进行函数运算,排序、分组等,对排序列运算,用不了索引。
优化:
MySQL 虚拟列,将对列运算的函数单独抽取为一个列,并建立索引。
group by 优化: 包括 sort_buffer_size tmp_table_size 等
SELECT
DATE_FORMAT(
concat( date( a.create_time ), ' ', HOUR ( a.create_time ), ':', floor( MINUTE
( a.create_time ) / 10 ) * 10 ),
'%Y-%m-%d %H:%i'
) time,
COUNT(id) timeCount
FROM
mq_receive_history a
WHERE
a.create_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
and a.code = 'heartbeat' and a.del_flag = 0
GROUP BY time
ORDER BY time;
表结构:
CREATE TABLE `mq_receive_history` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`create_time` timestamp(0) NULL DEFAULT NULL,
`update_time` timestamp(0) NULL DEFAULT NULL,
`del_flag` bit(1) NULL DEFAULT NULL,
`code` varchar(255) ,
`gid` varchar(255) ,
`uid` varchar(255) ,
`msg_id` varchar(255) ,
`receive_time` timestamp(0) NULL DEFAULT NULL,
`data` longtext,
`receive_message`,
`error_code` int(11) NULL DEFAULT NULL,
`error_msg` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL
DEFAULT NULL,
`is_ui_run` bit(1) NULL DEFAULT NULL,
`is_system_login` bit(1) NULL DEFAULT NULL,
`code_run_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL
评论