同样的mysql,同样的查询,为啥在不同的服务器上的查询效率差别有10几倍 继上一篇索引优化后,在自己的服务器上已经从10几秒优化到了2s,以为万事大吉了, 谁知道,同样的操作,在客户的服务器上优化后,还是比本机慢了10几倍 当然了,客户服务器上添加完索引后,相对之前已经快了不少,sql查询已经优化到了极点
为什么会比自己的服务器慢10几倍呢? 这让我开始怀疑客户服务器的内存使用
由于客户的mysql,当时我是使用docker镜像,所以一开始想到的解决方案是扩大docker容器的内存
但是后来一想,即使内存扩大了,保不住下次还会不够用,为啥一个小小的mysql能把内存占满了,
不行,必须从mysql上解决根本问题,而不是一位的扩大内存
于是,我开始了如下操作:
神马?这么高!!!
在mysql 输入 show processlist ;查询存在的连接数以及timeout的时间,可以帮助识别出有问题的查询语句
发现有好多造成查询慢的语句
mysql> show processlist; //info只能查看前100字符
show full processlist; //查看所有info
select * from information_schema.PROCESSLIST
t WHERE t.COMMAND in ‘Query’
wait_timeout:mysql服务器关闭非交互连接之前等待活动的秒数。 wait_timeout过大有弊端,MySQL里大量的SLEEP连接无法及时释放,拖累系统性能; 设置过小,可能会遇到“MySQL has gone away”之类的报错 Linux系统中,默认是28800秒,可设置最小值1,最大值31536000
此处我们设置100
设置完之后查看cpu占用率(设置完之后不确定会不会马上降低) 但是cpu占用率确实降 了一半
研究了一下,怎么kill掉慢的sql语句 1 单个killmysql> show processlist;mysql > kill 251;2 批量kill2.1查找Lockd语句mysql -uroot -p123456 -h 192.1.20.101 -e “show processlist” | grep -i ‘Locked’ > locked_log.txt2.2 组合killfor line in cat locked_log.txt | awk '{print
kill完成后,再次查看cpu占用率
再次执行查询语句,发现已经可以降低到2s左右