SQL 导致cup过高了,这次该我提桶了

前言

2025年4月16日,天气阴,8点30刚出健身房,心里默念又是充满希望的一天✨

打开钉钉,一条@消息映入眼帘😱,感谢领导昨天晚上没有call🗽

昨天晚上 8点半,生产环境SQL占用cpu过高 🧨

问题分析

看到这个问题,我基本上已经定位到问题了。估计是 人大金仓执行计划 和 服务器的 CPU 以及磁盘的性能存在问题!因为这个SQL 迁移之前也没问题的。

前两天也出现过SQL 超时的问题,还写了一篇文章: 小小的改动,竟然效率提高了1000倍

这次的问题 按照道理 应该也是一样,因为join了多张表,同时SQL的执行计划走的是Loop join导致消耗了很多cpu资源 。

💀联系了研发经理之后,用工具测试了一下性能,新环境的 性能 粗略计算的性能只有原来环境的三分之一(但是配置比以前环境的都高)

连表查询kingbase 可能走 Nested Loop 进行连表,有时候不会走 hash join. 走 Nested Loop 加上join的表有好几个,因此导致导致消耗掉了大量的cup性能. 本篇文章就不带大家看执行计划了

今天早上同事把id的Integer改成bigint 居然就好了,而且这个 id没有做关联,只是在条件中用了where id is null,就没办法去看执行计划了

有兴趣的可以看之前的文章里面有执行计划分析

为什么Nested Loop如此消耗性能

  1. 什么是Nested loop

    翻译过来就是嵌套循环,如下MySql官网的距离说明

  2. Nested loop 时间复杂度

    知道嵌套循环之后,我们就可以大概估算出,在最极端的情况3表join的时间复杂度 为 O(r1 * r2 * r3),假设数量级在w的级别,10 * 1000 * 10000 = 1亿 ,可以看到数量不多的情况 使用Nested Loop 也会出现上亿次的计算。

所以Nested loop 比较消耗cpu 资源的。mysql 官网nested-loop

虽然我用的是kingbase,但是我有时候看一些文档,还是会去mysql、pg-sql看的,底层的这些核心算法逻辑,还是相通的。

如何解决Nested loop循环问题

数据库本身层面是如何优化的

  1. hash join 算法 (mysql)
    ✔MySQL(8.0.18 及更高版本)会尽可能的去使用hash 算法进行join。
    ✔MySQL 8.0.20 block nested loop 已经被移除,所以mysql 高版本使用loop循环的方式就更少。

所以 mysql 的高版本对于 多表join,性能还是比较好的。但是数据量大的话,join表多话,就需要关注性能问题了。文章推荐:在sql 中谨慎使用多表join

  1. merge join 、hash join (pgsql)
    pgsql 对于join 来说,就有三种选择 nested loop joinmerge joinhash join ,当连表如果查询使用的关系少于 geqo_threshold,会寻找最优的方式执行。

写法层面

  • 连表键:能否优化连表键,连表的键尽量走索引的吧
  • 分解查询:在内存中自己做关联,即先从数据库中把数据查出来之后,再次查询,然后再进行数据封装。
  • 考虑数据冗余 :在某些情况下,可以考虑数据冗余来减少 JOIN 的需要。
  • 宽表:就是基于一定的join关系,把数据库中多张表的数据打平做一张大宽表,可以同步到ES或者干脆直接在数据库中直接查都可以

总结

所以啊各位,连表查询的时候小心咯!可能换了一个数据版本环境就GG了💥

当然mysql 和 pgsql 应该问题不大的,国产库的话 升级环境就小心了💥

相关推荐
java_logo9 分钟前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
广州灵眸科技有限公司8 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手10 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学10 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh12 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD13 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo14 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
TlSfoward14 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记15 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘