Mysql 运行时问题排查
时间:2019-05-17 13:23 来源:linux.it.net.cn 作者:IT
前几天有位同学碰到这样一个问题:之前运行良好的一段程序,由于最近数据量变大了,经常报取不到数据库连接的错误。将问题的解决过程总结记录下来:
首先,查看数据库配置的最大连接数,没有发现任何配置问题
show VARIABLES like 'max_connections'
然后,在问题复现时段看了一下数据库的执行状态,发现有大量的执行query操作的连接,且耗时非常长
show processlist
对select语句进行分析,发现语句索引设计的有问题,查询时全表扫描!重建索引问题解决
这里重点说下,show processlist
如果是root用户执行,能看到所有用户的当前的连接状态。如果是普通账号,只能看到当前账号占用的数据库连接。show proccesslist只能列出前100条,如果想看全数据的话要使用 show full processlist。
另外,show processlist与下面语句等价
select * from information_schema.`PROCESSLIST`
举个例子,说明如何通过show processlist发现问题
执行下面语句模拟占用数据库连接2分钟,然后执行show processlist
select sleep(120)
可以清晰的看到,每个数据连接执行的命令(Command)、耗时(Time)、状态(State)及语句(Info)
最后,分享一下数据库日常开发的的心得
1.复用数据库连接
2.优化sql及索引,如果数据量较大可以考虑数据分片(分库分表)
3.优化代码逻辑:
1)数据分页,减少一次取出的数据量
2)减少数据库的交互频次,批量查询、更新
(责任编辑:IT)
前几天有位同学碰到这样一个问题:之前运行良好的一段程序,由于最近数据量变大了,经常报取不到数据库连接的错误。将问题的解决过程总结记录下来: 首先,查看数据库配置的最大连接数,没有发现任何配置问题 show VARIABLES like 'max_connections' 然后,在问题复现时段看了一下数据库的执行状态,发现有大量的执行query操作的连接,且耗时非常长 show processlist 对select语句进行分析,发现语句索引设计的有问题,查询时全表扫描!重建索引问题解决 这里重点说下,show processlist 如果是root用户执行,能看到所有用户的当前的连接状态。如果是普通账号,只能看到当前账号占用的数据库连接。show proccesslist只能列出前100条,如果想看全数据的话要使用 show full processlist。 另外,show processlist与下面语句等价 select * from information_schema.`PROCESSLIST` 举个例子,说明如何通过show processlist发现问题 执行下面语句模拟占用数据库连接2分钟,然后执行show processlist select sleep(120) 可以清晰的看到,每个数据连接执行的命令(Command)、耗时(Time)、状态(State)及语句(Info) 最后,分享一下数据库日常开发的的心得 1.复用数据库连接 2.优化sql及索引,如果数据量较大可以考虑数据分片(分库分表) 3.优化代码逻辑: 1)数据分页,减少一次取出的数据量 2)减少数据库的交互频次,批量查询、更新 (责任编辑:IT) |