慢查询排查与解决思考

通常业务复杂、数据过多、索引未加等情况可能引起慢查询,这次排查是数据字段过大导致的,问题影响较大,数据库一度出现问题。

接下来分享下排查过程:

1.问题现象

顾名思义,慢查询就是query 类型SQL执行慢,本次问题产生是在生产环境的数据库里,一个特定关键字查询耗时180+秒,换关键字查询则不会出现这样的问题。

2.初步定位

  • 查看数据量,10W级,随着业务增加,日增5W,从20W到100W只过了2周

  • 查看表结构,存在大字段,单表多个大字段(这数据设计问题

  • 业务相关:多个节点,并发操作,存在多节点同时写的可能

3.——此时。。。数据挂了,生产的数据库挂了,具体原因虽然和这个无关,但是足足block问题排查3周时间

4.三周里

a. 这个问题在开发环境没法验证,测试环境也好,query还都挺快的,那么咋整,在数据坏之前,我还申请导出那批数据(经过允许的),试图本地恢复

——单表数据3+GB

这也是问题哦,3G数据的文本SQL文件(应该直接导出数据,这样文件可以小点),到了开发用的L480,用sublime打开需要很久,用VScode需要一会儿,提示说增加内存,加!加到4GB可以打开了,挺快,但是要执行SQL导入几乎不可能!

我试图用图形界面来执行的时候,结果,VScode突然就挂了,然后再看数据,3GB成了60+MB,居然自己给我截断了——教训,重要数据千万备份好,不然那个开源、免费的或者盗版的software会让你后悔!

b. 大字段转储,文件、对象存储等转移大字段

c. MQ缓存,缓解存储压力

5.最终

一通SQL大法好

# 数据库磁盘占用(全)
select concat(truncate(sum(data_length)/1024/1024/1024,2),' GB') as data_size from information_schema.tables;
# 各库大小
select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' MB') as data_size,
concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size
from information_schema.tables
group by TABLE_SCHEMA
order by data_size desc; 

-- 慢查询日志开关、查询
show variables like 'slow_query_log';

show variables like 'long_query_time';

show variables like 'slow_query_log_file';

sql mysqldumpslow -s t -t 10 -g 'select' /data/mysql/data/dcbi-3306/log/slow.log

-- 字段长度
SELECT length(result_uuid) from **

-- sql分析,打开SQL轮廓
show VARIABLES like 'profiling';

show profiles;

-- 根据上一步过程记录id,查询详情
show profile cpu, block io for query **;

大字段造成过多IO

60+MB的大字段,一个敢设计,一个敢存储

奉劝大家设计数据库要善良啊,数据虽好,可不要偷懒!

### SQL查询性能优化的方法和步骤 #### 开启慢查询日志 为了识别并解决SQL查询中的瓶颈,首先需要启用MySQL的慢查询日志功能。此功能能够记录执行时间超过指定阈值的查询语句,从而帮助开发者定位低效的SQL操作[^1]。 #### 使用`SHOW FULL PROCESSLIST`分析当前运行状态 当数据库响应变慢时,可以利用`SHOW FULL PROCESSLIST`命令来实时监控正在执行的SQL语句及其状态。对于紧急场景,推荐使用带有`-e`选项的非交互式方式调用该命令,并结合诸如`grep`之类的工具进一步筛选目标数据流,以便更快地发现问题所在[^3]。 #### 运用`mysqldumpslow`统计汇总慢查询信息 针对已经积累了一定量级的日志文件,可借助专门设计用于解析这些日志的应用程序——比如`mysqldumpslow`—来进行分类总结。它支持多种排序标准以及灵活的结果过滤机制,例如按返回行数最多、访问频率最高或者耗时时长最长等方式排列最值得关注的一些案例[^5]。 #### JOIN查询优化技巧 在涉及表间关联的操作里,合理设置连接条件至关重要。应尽量减少不必要的笛卡尔积运算规模;同时注意选取恰当的数据结构形式(如哈希查找代替嵌套循环)以加速匹配过程。另外,在可能的情况下提前限定参计算的目标范围也能有效降低整体复杂度[^2]。 #### 提高ORDER BY效率的最佳实践 关于排序类指令,有几点值得注意的地方包括但不限于以下几个方面: - 避免无谓的大批量全量扫描动作; - 合理配置内存缓冲区尺寸参数; - 明确指出所需检索的具体列名而非通配符(*); - 构建适合特定应用场景需求的有效索引组合方案; - 维护统一的方向指示规则防止额外开销发生等等[^4]。 ```sql -- 示例:高效分页读取最近订单详情片段 SELECT id, order_no, amount, create_time FROM orders WHERE create_time > '2023-01-01' ORDER BY create_time DESC LIMIT 10 OFFSET (page_number - 1)*page_size; ``` 以上就是围绕着如何改善SQL请求表现水平所列举出来的若干核心要点概述说明文档内容摘要部分结束标记位置处放置参考资料编号链接指向原始出处来源依据规定格式要求完成整个段落撰写工作流程描述完毕之后紧接着进入下一环节即提出几个密切相关的探讨话题供读者继续深入思考研究学习交流分享经验心得收获成长进步空间无限广阔美好未来值得期待憧憬向往追求卓越成就非凡梦想成真指日可待加油吧少年们!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackie_05

oo

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值