mysql如何找出慢sql

mysql如何找出慢sql,第1张

long_query_time 参数的查看

默认是10秒,10秒以上的sql会记录。可进行值的修改,

long_query_time 默认不开启 ,如果不是需要进行开始调优,一般不建议开启此参数。

永久开启:

在my.cnf中的

1.查看慢查询的时长

看此图默认10秒,是大于10秒,不等于10秒。

2.修改此时长

临时修改,重启mysql后失效,修改后需要新开连接才能查询到

永久在配制文件中修改

查看慢sql个数

将所有没有使用带索引的查询语句全部写到慢查询日志中

设置没带索引的慢sql进行记录

最后汇总my.cnf配制

什么是慢sql?慢sql的定义,目前共识是rt>1S,当存在1s以上的sql,qps比较高(150)时候,大概率会发生线上问题

风险维度:

执行时间rt:执行时间超过1s

平均扫描行数:扫描行数过高则一般说明sql有优化空间

全表扫描:一般是由于没有配置索引

平均返回行数:返回行数过高,对系统逻辑有一定的风险

索引覆盖:当前sql不是最佳索引

索引知识:

查看表索引:show index from table_name

查看sql语句影响行数:explain select * from user where phone=‘xxx’

索引错用:

1.类型隐士转换

wrong: select * from user where phone=xxx

right: select * from user where phone=‘xxx’

2.索引字段使用函数或者运算

wrong: select * from user where Date(create_at)=‘2019-12-12’

right:select * from user where create_at>‘2019-12-12’ AND create_at<'2019-12-13'

3.谨慎使用OR,OR中只要有一个没有索引,就会走全表扫描

select name from user where id=10 and sex=‘男’,sex没有索引,导致走全表

4.Like 正确使用,like ‘%xxx’ |like ‘%xxx%’,会让索引失效,但可以使用like‘xx%’

5.不应该使用select *,而是需要什么查什么

select name from user,当name有索引的时候,直接扫描索引,不需要再扫表,索引覆盖

6.谨慎使用order by导致的内存排序

7.当搜索范围很大时,mysql估计使用全表扫描要比索引快,则不适用索引

0、首先排除机器问题,如cpu、内存情况

1、根据日志找到sql语句,从两点,一是索引、二是语句的写法

2、使用mysql的explain+语句形式,排查是否引用索引,通过key、extra,key表示有没有用到索引,用到的是哪个索引,像like、or等是索引失效的,extra using index表示覆盖索引,usingwhere表示where条件用到了索引,通过explain结果,修改sql语句,该加索引加索引,该修改语句修改语句

3、语句编写上,子查询、关联查询大表小表

4、部署测试


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/6189494.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-17
下一篇 2023-03-17

发表评论

登录后才能评论

评论列表(0条)

保存