-
查看进程状态
-
service mysqld status
-
- 打印信息
- 打印信息中的 Main PID 就是进程ID
-
查看进程对应线程状态
-
#top命令 top -Hp PID #htop命令 htop -p PID
- 使用上面命令根据PID查询该进程对应的线程
- 从打印信息中就可以清晰的看到每个线程的占用情况,这个时候只需要找到占用率最高的那个线程的PID记在小本本上
-
-
查找线程执行的sql语句
-
select a.user, a.host, a.db, b.thread_os_id, b.thread_id, a.id processlist_id, a.command, a.time, a.state, a.info from information_schema.processlist a, performance_schema.threads b where a.id = b.processlist_id and (b.thread_os_id = 记在小本本上的PID or b.thread_os_id = 可以写多个);
通过上述sql语句就可以实现根据记在小本本上的PID查询出对应执行的sql信息,结果如下
-
参数解析:
-
user | 用户 |
host | 地址+端口号 |
db | 数据库 |
thread_os_id | 系统内部分配的线程ID,当然,OS不会为每一个会话创建os_id |
thread_id | 仅在perforamance_schema中使用,是其内部自动增长的计数器,前台和后台线程均有这个id,且thread_id和thread_os_id相关联 |
processlist_id | 一般在mysql层使用,跟前台登录会话相关联,是真正的线程ID。 processlistid和前台用户直接相关,每创建一个登录会话,就会新增一个processlistid。 在performance_schema.threads表中,后台线程没有processlistID的值,这个值是NULL,这是因为后台线程不是登录用户所创建的,但是前后台线程都会有thread_os_id和thread_id的值,因为所有线程最终都要依赖OS线程执行,thread_id和thread_os_id有一定的对应关系 |
command | 当前执行sql的类型,查询,修改,删除,新增 |
time | 时间 |
state | 状态 |
info | 具体执行的sql语句 |
-
优化建议
根据info中的sql信息,用于定位我们代码中的调用的位置,然后根据实际情况进行进一步优化