五分钟看完知道什么是MySQL慢查询

基于FPGA的TDC延迟链优化码密度校准方法(1)——原理实现 本文深入探讨了基于FPGA的时间数字转换器(TDC)延迟链非均匀性问题及其码密度校准方法。通过分析工艺偏差、温度电压影响等根源,详细介绍了码密度测试原理、逐位校准技术及气泡消除算法,并分享了自适应校准策略多场景应用实践,有效提升TDC测量精度至皮秒级。 阅读详情

​一、什么是慢查询

什么是MySQL慢查询呢?其实就是查询的SQL语句耗费较长的时间。

具体耗费多久算慢查询呢?这其实因人而异,有些公司慢查询的阈值是100ms,有些的阈值可能是500ms,即查询的时间超过这个阈值即视为慢查询。

正常情况下,MySQL是不会自动开启慢查询的,且如果开启的话默认阈值是10秒

# slow_query_log 表示是否开启 mysql> show global variables like '%slow_query_log%'; +---------------------+--------------------------------------+ | Variable_name | Value | +---------------------+--------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/0bd9099fc77f-slow.log | +---------------------+--------------------------------------+ # long_query_time 表示慢查询的阈值,默认10秒 show global variables like '%long_query_time%'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 复制代码

二、慢查询的危害

既然我们这么关注慢查询,那它肯定是有一些不好的地方,常见的有这几个:

1、用户体验差。

我们访问一个东西,或者保存一个东西,都得等好久,那不得分分钟弃坑?等等,我知道体验是会差,但慢查询的阈值设置为100ms似不似太低了,我访问一个东西1-2秒应该也能接受吧。其实这个阈值并不算太低,因为这是一条SQL的阈值,而你一个接口可能要查好几次SQL,甚至调下外部接口都是很常见的。

2、占用MySQL内存,影响性能

MySQL内存本来就是有限的(大内存要加钱!),SQL为什么查询慢呢?有时候就是因为你全表扫导致查询的数据量很多,再加上各种筛选就变慢了,所以慢查询往往也会意味着内存占用的增高,内存一高,能够承载的SQL查询就变少了,性能也变差了。

3、造成DDL操作阻塞

众所周知,InnoDB引擎默认加的是行锁,但锁其实都是加在索引上的,如果筛选条件没有建立索引,会降级到表锁。而慢查询有一大部分原因都是因为没加索引导致的,所以慢查询时间过长,就会导致表锁的时间也很长,如果这时候执行DDL就会造成阻塞。

三、慢查询常见场景

既然慢查询造成的问题这么多,那一般什么场景下会出现慢查询呢?

1、没加索引/没利用好索引

在没加索引的情况,就会造成全表扫描;又或者没走到索引(或者走的不是最优索引),这两张情况都会导致扫描行数增多,从而查询时间变慢。

下面是我测试的一个例子:

# 这是我的表结构,算是一种比较常规的表 create table t_user_article ( id bigint unsigned auto_increment primary key, cid tinyint(2) default 0 not null comment 'id', title varchar(100) not null, author varchar(15) not null, content text not null, keywords varchar(255) not null, description varchar(255) not null, is_show tinyint(1) default 1 not null comment ' 1 0', is_delete tinyint(1) default 0 not null comment ' 1 0', is_top tinyint(1) default 0 not null comment ' 1 0', is_original tinyint(1) default 1 not null, click int(10) default 0 not null, created_at timestamp default CURRENT_TIMESTAMP not null, updated_at timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP ) collate = utf8mb4_unicode_ci; 复制代码

在上述表结构下,我通过 [Fill Database](https://filldb.info/) 这个网站随机生成了一批数据进行测验,可以看到,在没加索引的前提下,基本5万条数据后就会开始出现慢查询了(假设阈值为100ms)

数据量

字段数量

查询类型

查询时间

1000

*

全表(ALL)

约80ms

50000

*

全表(ALL)

约120ms

100000

*

全表(ALL)

约180ms

2、单表数据量太大

如果本身单表数据量太大,可能超千万,或者达到亿级别,可能加了索引之后,个别查询还是存在慢查询的情况,这种貌似没啥好办法,要么就看索引设置得到底对不对,要么就只能分表了。

3、Limit 深分页

深分页的意思就是从比较后面的位置开始进行分页,比如每页有10条,然后我要看第十万页的数据,这时候的分页就会比较“深”

还是上面的 t_user_article 表,你可能会遇到这样的一条深分页查询:

-- 个人测试: 106000条数据,耗时约 150ms select * from t_user_article where click > 0 order by id limit 100000, 10; 复制代码

在这种情况下,即使你的 click 字段加了索引,查询速度可能还是很慢(测试后和不加差不多),因为二级索引树存的是主键ID,查到数据还需要进行回表才能决定是否丢弃,像上面的查询,回表的次数就达到了100010次,可想而知速度是非常慢的。

结合上面的分析,目前的解决思路都是先查出主键字段(id),避免回表,再根据主键查出所有字段。

第一种,延迟关联,此时SQL变为:

-- 个人测试: 106000条数据,耗时约 90ms select * from t_user_article t1, (select id from t_user_article where click > 0 order by id limit 100000, 10) t2 WHERE t1.id = t2.id; 复制代码

第二种,分开查询,分开查询的意思就是分两次查,此时SQL变为:

-- 个人测试: 106000条数据,耗时约 80ms select id from t_user_article where click > 0 order by id limit 100000, 10; -- 个人测试: 106000条数据,耗时约 80ms select * from t_user_article where id in (上述查询得到的ID) 复制代码

大家可能会很疑惑,为什么要分开查呢,毕竟分开查可能最终耗时比一次查询还要高!这是因为有些公司(比如我司)可能只对单条SQL的查询时长有要求,但对整体的并没有要求,这时候这种办法就能达到一个折中的效果。

另外,大家在网上可能会看到利用子查询解决的办法,比如改成这样:

select * from t_user_article where id in (select id from t_user_article where click > 0 limit 100000, 10) 复制代码

但这时候执行你会发现抛出一个错误: “This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery’”,翻译过来就是子查询不支持Limit,解决办法也很简单,多嵌套一层即可:

-- 个人测试: 106000条数据,耗时约 200ms select * from t_user_article where id in (select t.id from (select id from t_user_article where click > 0 order by id limit 100000, 10) as t) 复制代码

但问题是测试后发现耗时反而变长了,所以并没有列举为一种解决办法。

4、使用FileSort查询

什么是FileSort查询呢?其实就是当你使用 order by 关键字时,如果待排序的内容不能由所使用的索引直接完成,MySQL就有可能会进行FileSort。

当查询的数据较少,没有超过系统变量 sort_buffer_size 设定的大小,则直接在内存进行排序(快排);如果超过该变量设定的大小,则会利用文件进行排序(归并)。

FileSort出现的场景主要有以下两种:

4.1 排序字段没加索引

# click 字段此时未加索引 explain select id, click from t_user_article where click > 0 order by click limit 10; # explain 结果: type:ALL Extra:Using where; Using filesort 复制代码

解决办法就是在 click 字段上加索引。

4.2 使用两个字段排序,但是排序规则不同,一个正序,一个倒序

# click 字段此时已加索引 explain select id, click from t_user_article where click > 0 order by click desc, id asc limit 10; # explain 结果: type:range Extra:Using where; Using index; Using filesort 复制代码

这种场景常出现于排行榜中,因为排行榜经常需要按照 某个指标倒序 + 创建时间正序 排列。这种目前暂时无解,有解决办法的大佬望在评论区留言。

总结

总的来说,看完本文应该对慢查询有所了解了,慢查询优化是一个经久不衰的话题,场景也非常多元化,需要对索引的原理以及索引命中有一定了解,如有错漏,望大佬们在评论区留言。

52、交通标志识别脑肿瘤分类深度学习模型研究 本文探讨了深度学习模型在交通标志识别和脑肿瘤分类中的应用。研究使用迁移学习和微调方法对孟加拉国交通标志数据集进行建模,比较了多个模型的性能,DenseNet201和ViT表现出色。在脑肿瘤分类方面,提出了一种基于DenseNet-121的两阶段框架,结合机器学习分类器实现了高准确率和F1分数。研究总结了模型选择的关键因素,并展望了未来的研究方向,包括数据集扩展和实际应用开发。 阅读详情

相关推荐

YOLOv9原创自研:卷积魔改 | 一种新颖的风车形卷积(PConv)融合注意力机制,加强微弱小目标检测能力

为了进一步提升小目标检测能力,风车形卷积(PConv)融合注意力机制进一步提升小目标检测能力

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 300

BraTS数据集处理详解[源码]

本文详细介绍了BraTS 2018数据集的预处理方法,包括数据加载、图像预处理和标签生成。BraTS数据集包含285个病例,每个病例有四个模态的MRI图像(t1、t2、flair、t1ce),目标是分割出三种肿瘤类型(whole tumor、enhance tumor、tumor core)。文章提供了代码示例,展示了如何读取和处理.nii.gz格式的图像文件,包括图像压缩、归一化和标签分离。此外,还介绍了如何将处理后的数据转换为适合深度学习模型输入的格式(4, 80, 96, 64)。文章最后提到后续将更新模型部分的详解,适合对医学图像分割感兴趣的读者参考。

公开整理-数字普惠金融指数-省级2011-2023年.dta

详细介绍及样例数据:https://blog.csdn.net/samLi0620/article/details/144371176

2024-6-12-IXI(npy存储)应用SR的数据处理代码解读

【代码】2024-6-12-IXI(npy存储)应用SR的数据处理代码解读。

qq_40723205的博客 812

深度学习实战-基于Vision Transformer的脑肿瘤MRI图像识别

本研究探索了基于Vision Transformer(ViT)的脑肿瘤MRI图像自动检测方法。项目采用Python 3.9和PyTorch框架,构建了一个端到端的智能诊断系统。通过分析包含肿瘤和非肿瘤类别的MRI数据集,使用ViT_base_patch16_224模型进行训练,在15个epoch后达到0.971的AUC值。实验过程包括数据预处理、模型训练评估,结果显示ViT能有效捕捉肿瘤特征,注意力可视化证实了模型关注区域肿瘤位置的相关性。

m0_64336780的博客 4077

图像分割】使用 MRI 图像进行脑肿瘤检测和分割(Matlab代码实现)

使用MRI(磁共振成像)图像进行脑肿瘤检测和分割是一项关键任务,可帮助医生准确诊断和治疗患者的脑部疾病。首先,从患者的MRI扫描中获取脑部图像数据。这些数据可能包括T1加权、T2加权和增强T1加权序列等。然后,对原始图像进行预处理,如去除噪声、图像配准和强度标准化,以准备进行后续的分析。利用图像处理和机器学习技术,对预处理后的MRI图像进行肿瘤检测。这通常涉及使用特征提取方法来识别潜在的肿瘤区域,如形态学特征、纹理特征和直方图特征等。

weixin_67304359的博客 1476

使用深度学习构建脑肿瘤分类

介绍深度学习常常出现在我们的日常生活中。在现代社会中,我们的生活方式出现了各种变化,例如自动驾驶汽车、谷歌助理、Netflix 推荐、垃圾邮件检测等等。同样,深度学习在医疗保健领域也得到了发展,我们使用深度学习模型通过核磁共振扫描检测脑肿瘤,使用肺部 X 射线检测 covid 等 。脑肿瘤是一种严重的疾病,每年记录的病例超过 100 万例。如果一个人患有脑肿瘤,则使用核磁共振成像 (MRI) 扫描...

深度学习与计算机视觉 3312

基于Swin Transformer的脑肿瘤MRI图像分类诊断系统

本研究提出了一种基于Swin Transformer模型的脑肿瘤MRI图像分类诊断系统,旨在实现对脑胶质瘤、脑膜瘤、垂体瘤及正常脑部影像的自动化识别诊断。系统通过深度学习训练,准确分类不同类型的脑肿瘤,提升了分类精度推理效率。Swin Transformer的分层结构移位窗口自注意力机制有效提取影像特征,为临床提供高置信度的诊断结果。该系统不仅提高了脑肿瘤的诊断准确性,还推动了深度学习在医学影像分析中的应用,助力脑肿瘤的早期检测智能筛查。

Dev7z的博客 1412

图像分割】使用 MRI 图像进行脑肿瘤检测和分割附Matlab代码

磁共振成像(MRI)作为医学影像领域的重要技术,具有无辐射、多参数成像和高软组织分辨率等优势,能够清晰呈现脑部的解剖结构和病变信息,在脑肿瘤的诊断、治疗方案制定及疗效评估中发挥着关键作用。脑肿瘤检测和分割旨在从 MRI 图像中准确识别肿瘤区域,区分肿瘤组织正常脑组织。这一任务不仅有助于医生精确判断肿瘤的位置、大小、形态和性质,还为后续的手术规划、放疗靶区勾画等提供重要参考。

Matlab_jiqi的博客 1078

【免费下载】 Kaggle MRI脑肿瘤图像数据集下载仓库

Kaggle MRI脑肿瘤图像数据集下载仓库 【下载地址】KaggleMRI脑肿瘤图像数据集下载仓库 本仓库提供了一个在Kaggle上公开可用的MRI脑肿瘤图像数据集的下载资源。该数据集包含了大量的高质量MRI图像,适用于脑肿瘤分类、分割和检测等任务 ...

gitblog_09762的博客 2230
上一篇: 看懂 MySQL 执行计划花费不到十来分钟
下一篇: 看完你才知道什么是Redis的持久化机制
Java_LingFeng
博客等级 码龄4年 501粉丝 259原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值