热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

美团面试题:慢SQL有遇到过吗?是怎么解决的?

2017年的时候,我刚去上海,朋友内推我去美团面试,之前我也写过一个一篇文章,也是在美团面试中遇到的:关于慢SQL,我和面试官扯了很久,面试官也是很谦虚的,总是点头,自己以为回答的

2017年的时候,我刚去上海,朋友内推我去美团面试,之前我也写过一个一篇文章,也是在美团面试中遇到的:

关于慢SQL,我和面试官扯了很久,面试官也是很谦虚的,总是点头,自己以为回答的还可以。最后的最后,还是说了“你先回去等通知吧!”。

所以,我决定把这个慢SQL技术点,好好和你分享分享。希望你下次在遇到类似的面试,能顺顺利利轻轻松松的斩获自己想要的offer。

人生最大的喜悦是每个人都说你做不到,你却完成它了!

什么是慢SQL?
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录MySQL中查询时间超过(大于)设置阈值(long_query_time)的语句,记录到慢查询日志中。

其中,long_query_time的默认值是10,单位是秒,也就是说默认情况下,你的SQL查询时间超过10秒就算慢SQL了。

如何开启慢SQL日志?
在MySQL中,慢SQL日志默认是未开启的,也就说就算出现了慢SQL,也不会告诉你的,如果需要知道哪些SQL是慢SQL,需要我们手动开启慢SQL日志的。

关于慢SQL是否开启,我们可以通过下面这个命令来查看:

-- 查看慢查询日志是否开启
show variables like '%slow_query_log%';


在这里插入图片描述
通过命令,我们就可以看到slow_query_log项为OFF,说明我们的慢SQL日志并未开启。另外我们也可以看到我们慢SQL日志存放于哪个目录下和日志文件名。

下面我们来开启慢SQL日志,执行下面的命令:

set global slow_query_log = 1;
这里需要注意,这里开启的是我们当前的数据库,并且,我们重启数据库后会失效的。

开启慢SQL日志后,再次查看:

 

slow_query_log项已经变成ON,说明开启成功。

上面说过慢SQL默认时间是10秒,我们通过下面的命令就可以看到我们慢SQL的默认时间:

show variables like '%long_query_time%';


在这里插入图片描述
我们总不能一直使用这个默认值,可能很多业务需要时间更短或更长,所以此时,我们就需要对默认时间进行修改,修改命令如下:

set long_query_time = 3;
修改完了,我们再来看看是否已经改成了3秒。

 

这里需要注意:想要永久的生效,还需要修改MySQL下面的配置文件my.cnf 文件。

[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/atguigu-slow.log
long_query_time=3
log_output=FILE
注意:不同操作系统,配置有些区别。

Linux操作系统中

在mysql配置文件my.cnf中增加

log-slow-queries=/var/lib/mysql/slowquery.log (指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log)

long_query_time=2 (记录超过的时间,默认为10s)

log-queries-not-using-indexes (log下来没有使用索引的query,可以根据情况决定是否开启)

log-long-format (如果设置了,所有没有使用索引的查询也将被记录)

Windows操作系统中

在my.ini的[mysqld]添加如下语句:

log-slow-queries = E:\web\mysql\log\mysqlslowquery.log

long_query_time = 3(其他参数如上)

执行一条慢SQL,因为我们前面已经设置好了慢SQL时间为3秒,所以,我们只要执行一条SQL时间超过3秒即可。

SELECT SLEEP(4);


该SQL耗时4.024秒,下面我们就来查看慢SQL出现了多少条。

使用命令:

show global status like '%Slow_queries%';


查询SQL历程
找到慢SQL日志文件,打开后就会出现类似下面这样的语句;

# Time: 2021-07-20T09:17:49.791767Z
# User@Host: root[root] @ localhost [] Id: 150
# Query_time: 0.002549 Lock_time: 0.000144 Rows_sent: 1 Rows_examined: 4079
SET timestamp=1566292669;
select * from city where Name = 'Salala';
简单说明:

1.Time 该日志记录的时间

2.User @Host MySQL登录的用户和登录的主机地址

3.Query_time一行 第一个时间是查询的时间、第二个是锁表的时间、第三个是返回的行数、第四个是扫描的行数

4.SET timestamp 这一个是MySQL查询的时间

5.sql语句 这一行就很明显了,表示的是我们执行的sql语句

切记

如果你将long_query_time=0 ,那就意味着,我们所有的查询SQL语句都会输出到慢SQL日志文件中。

如何定位慢SQL?
通常我们定位慢SQL有两种方式:

第一种:定位慢查询SQL可以通过两个表象进行判断

系统级表象:

使用sar命令和top命令查看当前系统的状态

也可以使用Prometheus和Grafana监控工具查看当前系统状态

CPU消耗严重

IO等待严重

页面响应时间过长

项目日志出现超时等错误

SQL语句表象:

SQL语句冗长

SQL语句执行时间过长

SQL从全表扫描中获取数据

执行计划中的rows和cost很大

第二种:根据不同的数据库使用不同的方式获取问题SQL

MySQL:

慢查询日志

测试工具loadrunner

ptquery工具

Oracle:

AWR报告

测试工具loadrunner

相关内部视图vsession_wait

GRID CONTROL监控工具

熟悉慢SQL日志分析工具吗?
如果开启了慢SQL日志后,可能会有大量的慢SQL日志产生,此时再用肉眼看,那是不太现实的,所以大佬们就给我搞了个工具:mysqldumpslow。

mysqldumpslow能将相同的慢SQL归类,并统计出相同的SQL执行的次数,每次执行耗时多久、总耗时,每次返回的行数、总行数,以及客户端连接信息等。

通过命令

mysqldumpslow --help
可以看到相关参数的说明:

~# mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

Parse and summarize the MySQL slow query log. Options are

--verbose verbose
--debug debug
--help write this text to standard output

-v verbose
-d debug
-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time
ar: average rows sent
at: average query time
c: count
l: lock time
r: rows sent
t: query time
-r reverse the sort order (largest last instead of first)
-t NUM just show the top n queries
-a don't abstract all numbers to N and strings to 'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN grep: only consider stmts that include this string
-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
default is '*', i.e. match all
-i NAME name of server instance (if using mysql.server startup script)
-l don't subtract lock time from total time
比较常用的参数有这么几个:

-s 指定输出的排序方式
t : 根据query time(执行时间)进行排序;
at : 根据average query time(平均执行时间)进行排序;(默认使用的方式)
l : 根据lock time(锁定时间)进行排序;
al : 根据average lock time(平均锁定时间)进行排序;
r : 根据rows(扫描的行数)进行排序;
ar : 根据average rows(扫描的平均行数)进行排序;
c : 根据日志中出现的总次数进行排序;
-t 指定输出的sql语句条数;
-a 不进行抽象显示(默认会将数字抽象为N,字符串抽象为S);
-g 满足指定条件,与grep相似;
-h 用来指定主机名(指定打开文件,通常慢查询日志名称为“主机名-slow.log”,用-h exp则表示打开exp-slow.log文件);
使用方式
mysqldumpslow常用的使用方式如下:

# mysqldumpslow -s c slow.log
如上一条命令,应该是mysqldumpslow最简单的一种形式,其中-s参数是以什么方式排序的意思,c指代的是以总数从大到小的方式排序。-s的常用子参数有:c: 相同查询以查询条数和从大到小排序。t: 以查询总时间的方式从大到小排序。l: 以查询锁的总时间的方式从大到小排序。at: 以查询平均时间的方式从大到小排序。al: 以查询锁平均时间的方式从大到小排序。

同样的,还可以增加其他参数,实际使用的时候,按照自己的情况来。

其他常用方式:

# 得到返回记录集最多的10 个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log

# 得到访问次数最多的10 个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log

# 得到按照时间排序的前10 条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log

# 另外建议在使用这些命令时结合| 和more 使用,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more
接下,我们来个实际操作。

实操
root@yunzongjitest1:~# mysqldumpslow -s t -t 3

Reading mysql slow query log from /var/lib/mysql/exp-slow.log /var/lib/mysql/yunzongjitest1-slow.log
Count: 464 Time=18.35s (8515s) Lock=0.01s (3s) Rows=90884.0 (42170176), root[root]@localhost
select ************

Count: 38 Time=11.22s (426s) Lock=0.00s (0s) Rows=1.0 (38), root[root]@localhost
select *********** not like 'S'

Count: 48 Time=5.07s (243s) Lock=0.02s (1s) Rows=1.0 (48), root[root]@localhost
select ********='S'
这其中的SQL语句因为涉及某些信息,所以我都用*号将主体替换了,如果希望得到具体的值,使用-a参数。

使用mysqldumpslow查询出来的摘要信息,包含了这些内容:

Count: 464 :表示慢查询日志总共记录到这条sql语句执行的次数;

Time=18.35s (8515s):18.35s表示平均执行时间(-s at),8515s表示总的执行时间(-s t);

Lock=0.01s (3s):与上面的Time相同,第一个表示平均锁定时间(-s al),括号内的表示总的锁定时间(-s l)(也有另一种说法,说是表示的等待锁释放的时间);

Rows=90884.0 (42170176): 第一个值表示扫描的平均行数(-s ar),括号内的值表示扫描的总行数(-s r)。

是不是 so easy!!!!

很多朋友私下跟我说今年面试太难了,能不能整理一个大厂Java面试合集,这样也不用到处找资料,于是我花了一年的时间陆陆续续完成了整理,这些面试题都是互联网大厂真实流出的面试内容,每个问题都附带完整详细的答案,不像网上的那些资料三教九流有的甚至还没答案,这些面试题我也是经过日积月累才整理出来的精品资料。

面试题主要是针对1-5年左右的Java开发程序员提升的,不管是传统行业还是互联网行业,掌握这些技术基本都能拿到一个不错的薪资,希望对大家有所帮助。

深圳、上海、杭州、北京、广州真实Java面试题
北京-百度-Java中级.pdf

北京-京东-Java实习生.pdf

杭州-阿里云Java实习生.pdf

杭州-蚂蚁金服-Java高级pdf

杭州-蚂蚁金服-资深工程师.pdf

南京-软通动力-Java初级pdf

厦门-中软国际-Java初级.pdf

上海拼多多-Java高级.pdf

上海携程-Java高级.pdf

深圳-OPPOJava高级.pdf

深圳-丰巢科技-Java高级.pdf

深圳|乐信-Java高级.pdf

深圳-蚂蚁金服-Java高级.pdf

深圳-商汤科技-Java高级pdf

深圳|腾讯-Java高级.pdf

深圳-银盛支付-Java中级.pdf

深圳-中国平安-Java中级.pdf

Java企业面试真题合辑(上) .docx

Java企业面试真题合辑(上) .pdf

Java企业面试真题合辑(下) .pdf

Java程序员面试笔试宝典.pdf

Java程序员面试笔试真题库-完整版.pdf

Java企业笔试真题收录大全-最新版.pdf

广州唯品会Java大数据开发工程师.pdf

阿里巴巴Java面试题
阿里巴巴校招研发.pdf

阿里巴巴Javascript面试题.pdf

阿里巴巴一蚂蚁金服 Java面试题.pdf

阿里巴巴前端开发I程师笔试二.pdf

阿里巴巴前端开发工程师笔试- - .pdf

阿里巴巴研发工程师笔试选择题二.pdf

阿里巴巴研发工程师笔试选择题三.pdf

阿里巴巴研发工程师笔试选择题四.pdf

阿里巴巴研发工程师笔试选择题一.pdf

阿里巴巴DBA面试题[笔试面试] -2..pdf

史上最全阿里巴巴JAVA面试题总览.pdf

阿里巴巴校招测试开发工程师在线笔试题- 1.pdf

阿里巴巴腾讯华为小米搜狗笔试面试八十题-5.pdf

百度Java面试题
百度试题.pdf

百度校园招聘笔试题WEB前端工程师-电子科技大学pdf

百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题-6.pdf

互联网大型公司(阿里腾讯百度等) android面试题目 (有答案).com.pdf

腾讯Java面试题
腾讯试题.pdf

腾讯Java面试题.pdf

腾讯Java_工程师笔试题.pdf

腾讯研发I程师笔试真题二.pdf

腾讯研发工程师笔试真题三.pdf

腾讯研发工程师笔试真题一.pdf

腾讯高级软件_工程师、项目经理面试题- 4.pdf

字节跳动Java面试题
字节跳动面试题.pdf

字节跳动(今日头条、抖音) .pdf

字节跳动今日头条、抖音)往期面试真题.pdf

腾讯、阿里、字节跳动、百度、美团Java面试题合集
阿里面试集锦.docx

阿里面试题目总结-6.docx

阿里面试问题总结.docx

字节跳动(抖音面试题) .docx

最新BAT大数据面试题.docx

腾讯201 6研发I程师编程题_-.docx

阿里高级Java面试题70道.docx

腾讯201 6研发I程师编程题5.docx

最新BAT《前端必考面试》.docx

最全的阿里java面经(清晰版) .pdf

最新BAT java经典必考面试题.docx

阿里实习生客户端笔试题目解析-3.docx

腾讯校招Java、测试工程师笔试题com.docx

字节跳动前端工程师实习生笔试题汇总.docx

百度、腾讯、头条、美团的ava面试题目总结.docx

百度、腾讯、头条、美团的Java面试题目总结.com.docx



推荐阅读
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 如何修改MySQL数据库密码的方法及步骤详解
    本文详细介绍了四种修改MySQL数据库密码的方法,包括使用SET PASSWORD命令、mysqladmin命令、UPDATE语句直接编辑user表的步骤和操作示例。通过本文的指导,读者可以轻松掌握修改MySQL数据库密码的技巧和方法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
author-avatar
CleanTheString
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有