1. 什么是慢sql ?
1.1 当某条sql的响应时间超过longquerytime值的SQL,则会被记录到慢查询日志中
1.2 如何查询mysql设置的慢查日志阈值 longquerytime?
js show variables like 'long_query_time';
2. 显示慢查设置
show variables like '%slowquerylog%';
js slow_query_log //是否开启,默认关闭OFF,建议调优时才开启 slow_query_log_file //慢查询日志存放目录
如图mysql默认是关闭慢查日志的
3. 开启慢查日志
开启慢查日志
js set global slow_query_log=1;
定义慢查日志超时时间 默认是10秒 这里我们改成5秒 方便演示慢查
js set global long_query_time=5;
注意想让这个配置生效 需要另外开一个session或重新连接
4. 执行一下这速度感人的sql
js select * from xzll_student2000000 where ctime > '2021-08-10 00:00:00' and ctime <'2021-08-15 23:59:59' limit 1500000,10 -- 12.376s 啧啧~
5. 在终端通过mysql自带的mysqldumpslow工具慢看慢查日志
- mysql slow query log from 你的mysql慢查日志保存路劲
js (通过show variables like '%slow_query_log%';查看即可) ps: 途中count=2 是因为我执行了两次
6. mysqldumpslow 参数解释
6.1 先在终端执行
mysqldumpslow -h看看他都有那些参数
```js / » mysqldumpslow -h 255 ↵ hzz@huangzhuangzhuangdeMacBook-Pro
Option h requires an argument
ERROR: bad option
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' // 不使用 S替换字符串,不使用N替换数字
-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 //不从总时间中减去锁时间
```
6.2 常见操作
不添加-a操作
```js mysqldumpslow -s c -t 10 /usr/local/var/mysql/huangzhuangzhuangdeMacBook-Pro-slow.log
可以看到其将数字替换为N字符串替换为S ```
添加-a 参数 我们看看与不添加-a参数有什么区别?
js mysql slow query log from /usr/local/var/mysql/huangzhuangzhuangdeMacBook-Pro-slow.log
使用 -g 过滤你想要的
js mysqldumpslow -s c -t 10 -a -g 'ctime' /usr/local/var/mysql/huangzhuangzhuangdeMacBook-Pro-slow.log
-h 指定主机名
```js mysqldumpslow -s c -t 10 -a -h hzz /usr/local/var/mysql/huangzhuangzhuangdeMacBook-Pro-slow.log 可以指定通配符
```
7. log_queries_not_using_indexes:是否设置了把没有索引的记录到慢查询日志
7.1 mysql默认关闭!!!!!
注意 开启这个的话 会有大量的sql都会进入到慢查日志文件中 可能会造成影响
8. 本人关于sql优化的一点心得
一般我们分析出慢查sql后 使用explain就基本上可以定位出问题sql的问题;如果该sql从sql语句层面实在没办法优化。
那么: ~
1.查看机器的cpu情况 , 查看数据库io情况 看看是不是有大量的不合理的写操作?(很重要)。 或者从代码日志中是不是有高并发情况。(如果有大量读操作都查询同一个表 且写入不是特别高的时候,那么我们就要做缓存啦 比如最常见的使用redis 挑选个合适的数据结构,使用旁路缓存即1.先删除缓存2.写库3.插入缓存)的方式去做优化了。
2.查看数据库锁的情况,是否有死锁? 是否使用了乐观锁? 是不是在某时刻写多造成竞争突然加大从而加大数据库压力?
3.没有大量业务的写操作,那么查看是不是主从复制出问题导致占用io了。
4. 可能你需要去和业务方/产品 沟通下(看看有没有别的方案可以接受注意你一定要带着自己的方案去和他沟通如果你自己都觉得这个方案肯定是不能变得,那么你只能去从技术上找方法)
5. 如果业务量上来
( 说明你们公司的业务发展的不错蒸蒸日上 先做个梦主题就叫:天天sql夜夜sqlsql调优调优sql,上市分红财富自由sql牛逼牛逼sql )而且技术层面确实不好优化 那么你该拟定一个方案(比如现有业务量情况,我们的机器数量可以承担的业务量,我们需要加多少机器)等等 去和上级申请啦。这 也是终极方案,同时也是最有效的方案 哈哈
6. 可能根据不同场景还会有更多的优化方案 目前我想到的只有这些 欢迎补充~~~
sql慢查日志与sql优化心得到此完结。 ~ 如有不对恳请指正谢谢