背景
早上收到某系统的告警tidb节点挂掉无法访问,情况十万火急。登录中控机查了一下display信息,4个TiDB、Prometheus、Grafana全挂了,某台机器hang死无法连接,经过快速重启后集群恢复,经排查后是昨天上线的某个SQL导致频繁OOM。

于是开始亡羊补牢,来一波近期慢SQL巡检 #手动狗头#。。。
随便找了一个出现频率比较高的慢SQL,经过优化后竟然性能提升了1500倍以上,感觉有点东西,分享给大家。
分析过程
该慢SQL逻辑非常简单,就是一个单表聚合查询,但是耗时达到8s以上,必有蹊跷。
脱敏后的SQL如下:
SELECT
cast( cast( CAST( SUM( num ) / COUNT( time ) AS CHAR ) AS DECIMAL ( 9, 2 )) AS signed ) speed,
... -- 此处省略n个字段
FROM
(
SELECT
DATE_FORMAT( receive_time, '%Y-%m-%d %H:%i:00' ) AS time,
COUNT(*) AS num
FROM
db1.table
WHERE
create_time > DATE_SUB( sysdate(), INTERVAL 20 MINUTE )
GROUP BY
time
ORDER BY
time
) speed;
碰到慢SQL不用多想,第一步先上执行计划:
</

文章讲述了作者遇到TiDB系统故障,通过排查发现一个简单慢SQL因TiFlash的全表扫描导致性能问题。优化过程中,作者强调了动态时间对索引选择的影响,最终通过改用now()并加上hint引导优化器使用TiKV,性能提升显著。
最低0.47元/天 解锁文章
1727

被折叠的 条评论
为什么被折叠?



