问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何查找MySQL中查询慢的SQL语句

发布网友 发布时间:2022-04-22 04:31

我来回答

2个回答

热心网友 时间:2022-04-07 16:04

问题

我们有一个 SQL,用于找到没有主键 / 唯一键的表,但是在 MySQL 5.7 上运行特别慢,怎么办?

实验

我们搭建一个 MySQL 5.7 的环境,此处省略搭建步骤。

写个简单的脚本,制造一批带主键和不带主键的表:

执行一下脚本:

现在执行以下 SQL 看看效果:

...


执行了 16.80s,感觉是非常慢了。

现在用一下 DBA 三板斧,看看执行计划:


感觉有点惨,由于 information_schema.columns 是元数据表,没有必要的统计信息。

那我们来 show warnings 看看 MySQL 改写后的 SQL:

我们格式化一下 SQL:


可以看到 MySQL 将

select from A where A.x not in (select x from B) //非关联子查询

转换成了

select from A where not exists (select 1 from B where B.x = a.x) //关联子查询

如果我们自己是 MySQL,在执行非关联子查询时,可以使用很简单的策略:

select from A where A.x not in (select x from B where ...) //非关联子查询:1. 扫描 B 表中的所有记录,找到满足条件的记录,存放在临时表 C 中,建好索引2. 扫描 A 表中的记录,与临时表 C 中的记录进行比对,直接在索引里比对,

而关联子查询就需要循环迭代:

select from A where not exists (select 1 from B where B.x = a.x and ...) //关联子查询扫描 A 表的每一条记录 rA:     扫描 B 表,找到其中的第一条满足 rA 条件的记录。

显然,关联子查询的扫描成本会高于非关联子查询。

我们希望 MySQL 能先"缓存"子查询的结果(缓存这一步叫物化,MATERIALIZATION),但MySQL 认为不缓存更快,我们就需要给予 MySQL 一定指导。


...

可以看到执行时间变成了 0.67s。

整理

我们诊断的关键点如下:

\1. 对于 information_schema 中的元数据表,执行计划不能提供有效信息。

\2. 通过查看 MySQL 改写后的 SQL,我们猜测了优化器发生了误判。

\3. 我们增加了 hint,指导 MySQL 正确进行优化判断。

但目前我们的实验仅限于猜测,猜中了万事大吉,猜不中就无法做出好的诊断。

热心网友 时间:2022-04-07 17:22

一、MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句

1,slow_query_log
这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句。

2,long_query_time
当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短。

3,slow_query_log_file
记录日志的文件名。

4,log_queries_not_using_indexes
这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快。

二、检测mysql中sql语句的效率的方法

1、通过查询日志
(1)、Windows下开启MySQL慢查询
MySQL在Windows系统中的配置文件一般是是my.ini找到[mysqld]下面加上
代码如下
log-slow-queries = F:/MySQL/log/mysqlslowquery。log
long_query_time = 2

(2)、Linux下启用MySQL慢查询
MySQL在Windows系统中的配置文件一般是是my.cnf找到[mysqld]下面加上
代码如下
log-slow-queries=/data/mysqldata/slowquery。log
long_query_time=2
说明
log-slow-queries = F:/MySQL/log/mysqlslowquery。
为慢查询日志存放的位置,一般这个目录要有MySQL的运行帐号的可写权限,一般都将这个目录设置为MySQL的数据存放目录;
long_query_time=2中的2表示查询超过两秒才记录;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 深圳高新技术企业认定需要什么条件? 余胜泉的代表成果 联合科技咨询(深圳)有限公司怎么样? 深圳市科家企业咨询管理有限公司怎么样? 现在买华为mate10还能用吗 腌酸包菜怎么做好吃 研祥集团的研祥大事记 华为Mate10处理是什么芯片 2021年深圳高新技术企业认定申报要求是什么?大概时... 酸包菜怎么腌制 李振江的所获荣誉 腌制包菜怎么做好吃 鹏元资信评估有限公司的发展 华为mate10的处理器是什么? 鹏元 企业信用评级系统(完美版)怎么样? 酸辣包菜怎么做好吃 信息技术的应用实例 华为mate10处理器怎么样 寄生虫吃什么药可以杀死 深圳高新技术企业认定条件是什么? 如何解决mysql 查询和更新速度慢 祝母亲节快乐的句子 MySQL查询效率很慢的问题如何分析和解决 “母亲节快乐”的英语怎么写? 如何在mysql查找效率慢的SQL语句 板栗可以用烤箱烤熟吗 母亲节快乐的英语单词 Mysql 查询速度慢怎么办 母亲节快乐的好词好句 如果mysql里面的数据过多,查询太慢怎么办? 出境能戴假发么 什么叫发文汇编 假发可以带出门吗 公文汇编本是什么意思?是把好多公文文件订到一块吗? 母亲节快乐的英文怎么写? MySQL怎么查询比较耗时的sql语句 在家怎么用烤箱烤板栗 母亲节快乐的英文 火车上让带剪头发用的假发吗? mysql 创建完索引之后 ,查询反而变慢了,这是为什...