查processlist、innodb_trx、innodb_locks、innodb_lock_waits。在没有监控工具时,这几个是我经常在 MySQL 数据库检查的表,因为数据库如果慢的话,基本上会在这几个表中留些蛛丝马迹。
processlist 是看当前数据库中的 session 的,并且也会把正在执行的 SQL 列出来,快速刷新几次,就可以看到是不是有 SQL 一直卡在那里。innodb_trx是正在执行的 SQL 事务表,这个表很重要。innodb_locks和innodb_lock_waits是为了看有没有锁等待。
要想查锁,就得先知道当前正在运行的是什么样的事务,所以我们就去查一下 innodb_trx 表,因为 MySQL 在这个表中会记录所有正在执行的事务。
innodb_trx表提供了当前innodb引擎内每个事务的信息(只读事务除外),包括当一个事务启动,事务是否在等待一个锁,以及交易正在执行的语句
通常,我们会通过批量插入数据来优化 insert,所以,就需要调整 bulk_insert_buffer_size 参数(默认是 8M)来实现这一点。因为 bulk_insert_buffer_size 就是在批量插入数据时提高效率的。
bulk_insert_buffer_size是作用于myisam存储引擎的。在insert的时候,会用到临时表,而临时表是在myisam引擎中的,所以这个参数会对insert起到优化作用。
既然有锁等待,那自然要查一下锁关系,看看是什么在等待锁。
在MySQL8.0中是支持对select/delete/inster/replace/update
语句来分析执行计划
mysql执行计划结果的每个值的含义?
要想看 SQL 慢,就得看 SQL 对应的执行计划(在 MySQL 中,如果执行计划看得不清楚,还可以看 Profile 信息)
栈信息中有很多 getConnection,这明显是 Order 服务在等数据库连接池。