1、什么是慢Mysql?
MySQL慢查询就是在日志中记录运行比较慢的SQL语句,这个功能需要开启才能用。
2、为什么会出现慢Mysql
① 写操作
刷脏页
脏页的定义是这样的:内存数据页和磁盘数据页不一致时,那么称这个内存数据页为脏页。
对于一条写操作的 SQL 来说,执行的过程中涉及到写日志,内存及同步磁盘这几种情况。
在写操作时,InnoDB会将记录写入到 redo log 中,并更新缓存,这样更新操作就算完成了。后续操作存储引擎会适当的时候(buffer pool满了或者redo log满了)把操作记录同步到磁盘里,因为写redo log 的过程是顺序写磁盘的,磁盘顺序写减少了寻道等时间,速度比随机写要快很多( 类似Kafka存储原理),因此写 redo log 速度是很快的在磁盘中,redo log 顺序存储在两个文件中,大小是一定的,且是循环写入的。在高并发场景下,redo log 很快被写满了,但是数据来不及同步到磁盘里,这时候就会产生脏页,并且还会阻塞后续的写入操作。SQL 执行自然会变慢。
② 锁
写操作时 SQL 慢的另一种情况是可能遇到了锁,当某一条 SQL 所要更改的行刚好被加了锁,那么此时只有等锁释放了后才能进行后续操作。
3、当我们发现了有慢Sql的情况该如何查看呢?
① 进入mysql
查看日志是否打开:show variables like 'slow_query_log';
显示是已经打开的
② 若未打开需设置打开:set global slow_query_log = on;
关闭的话就执行:set global slow_query_log = off;
③ 查看慢SQL的时间: show global variables like 'long_query_time';
④ 查看日志文件名: show variables like 'slow_query_log_file';