一次数据库执行结果慢的梳理过程
2017-12-12 20:10
239 查看
背景:项目执行一个删除操作的时候发现耗时较长,但是不是必现。之前一直忙于赶进度,对这个问题没有仔细查看。项目进入维护阶段,决定花些时间看看到底是怎么回事通过查看后台的代码,怀疑两个地方,一个是项目中一个用于拼接字符串的工具类,一个是数据库中调用的SP,后来通过代码测试排除了第一中可能。在测试服务器上面进行复现,发现出现的概率还是比较高的。确实是一个SP执行过慢
1,show processlist;获取当前执行的线程执行情况
1379011 | root | localhost:35949 | XXXX | Query | 1 | Sending data | call `SP_XX`(id,name)
|发现有一个SP一直处于Sending data状态,说明这个表正在处理一些查询数据,而且time一直都是在0-2之前循环,说明一直在查询,不是阻塞(time会累加)既然确定了是这个sp的问题,看一下是不是出了什么错误
2,show engine innodb status,查看引擎的运行时信息
---TRANSACTION 714799, ACTIVE 1382 sec unlock_rowmysql tables in use 1, locked 16905 lock struct(s), heap size 942288, 2535 row lock(s), undo log entries 1051MySQL thread id 1379011, OS thread handle 139649494284032, query id 16945088 localhost 127.0.0.1
root Sending datacall `SP_XX`(id,name)
发现事物这部分也是这里。现在基本确定是这个SP的问题。但是SP整体看起来没有什么语法或者明显的错误。
3,show open tables;发现如下信息| Database | Table | In_use | Name_locked || XXX | a | 1 | 0 |这张表在这时候被占用了,In_use列表示有多少线程正在使用某张表,Name_locked表示表名是否被锁,而有问题的SP中确实也发现有调用这个table的操作,那么会不会就是这个table的问题呢?
4,SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G;INNODB_TRX 表包含信息关于每个事务(不包含只读事务) 当前在InnoDB内执行的,mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G*************************** 1. row *************************** trx_id: 714799 trx_state: RUNNING trx_started:
201x-xx-xx 19:19:08 trx_requested_lock_id: NULL trx_wait_started: NULL trx_weight: 8102 trx_mysql_thread_id: 1379011 trx_query: call `SP_XX`(id,name) trx_operation_state: fetching rows trx_tables_in_use: 1 trx_tables_locked:
5发现确实有一张表被占用,那么基本就是这张表了。到这里我们知道了具体是那个SP中的调用的哪个table的问题,问题就明朗了。通过查询发现是有问题的table本身没有添加索引导致,每次查询的时候都是全表扫描,所以特别慢。后来在这张表中添加了一个外键,没有再出现执行很长的问题记录下来作为后面处理类似问题的一个思路
1,show processlist;获取当前执行的线程执行情况
1379011 | root | localhost:35949 | XXXX | Query | 1 | Sending data | call `SP_XX`(id,name)
|发现有一个SP一直处于Sending data状态,说明这个表正在处理一些查询数据,而且time一直都是在0-2之前循环,说明一直在查询,不是阻塞(time会累加)既然确定了是这个sp的问题,看一下是不是出了什么错误
2,show engine innodb status,查看引擎的运行时信息
---TRANSACTION 714799, ACTIVE 1382 sec unlock_rowmysql tables in use 1, locked 16905 lock struct(s), heap size 942288, 2535 row lock(s), undo log entries 1051MySQL thread id 1379011, OS thread handle 139649494284032, query id 16945088 localhost 127.0.0.1
root Sending datacall `SP_XX`(id,name)
发现事物这部分也是这里。现在基本确定是这个SP的问题。但是SP整体看起来没有什么语法或者明显的错误。
3,show open tables;发现如下信息| Database | Table | In_use | Name_locked || XXX | a | 1 | 0 |这张表在这时候被占用了,In_use列表示有多少线程正在使用某张表,Name_locked表示表名是否被锁,而有问题的SP中确实也发现有调用这个table的操作,那么会不会就是这个table的问题呢?
4,SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G;INNODB_TRX 表包含信息关于每个事务(不包含只读事务) 当前在InnoDB内执行的,mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G*************************** 1. row *************************** trx_id: 714799 trx_state: RUNNING trx_started:
201x-xx-xx 19:19:08 trx_requested_lock_id: NULL trx_wait_started: NULL trx_weight: 8102 trx_mysql_thread_id: 1379011 trx_query: call `SP_XX`(id,name) trx_operation_state: fetching rows trx_tables_in_use: 1 trx_tables_locked:
5发现确实有一张表被占用,那么基本就是这张表了。到这里我们知道了具体是那个SP中的调用的哪个table的问题,问题就明朗了。通过查询发现是有问题的table本身没有添加索引导致,每次查询的时候都是全表扫描,所以特别慢。后来在这张表中添加了一个外键,没有再出现执行很长的问题记录下来作为后面处理类似问题的一个思路
相关文章推荐
- Laravel5.5源码详解 -- 一次查询的详细执行:从Auth-Login-web中间件到数据库查询结果的全过程
- JDBC执行存储过程得到多结果集
- 一次无备份、非归档数据库断电恢复的全过程
- 关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
- 给数据库用户设置存储过程执行权限的SQL语句
- Oracle 数据库如何搜集指定SQL的执行计划和解决过程中的ORA-00904错误
- 【Oracle 函数索引】一次数据库的优化过程
- jdbctempleate 执行postgres 数据库存储过程返回结果集
- 在数据库里执行 返回参数时,不是存储过程返回的值,而是跟在存储过程后面的那个@output变量
- oracle 存储过程执行可输入sql语句并返回结果集
- Task执行过程与结果处理
- mybatis执行查询语句查询不到结果,控制台输出sql语句复制到数据库中能查到数据
- Python脚本之django---mysql-记录主机性能数据到数据库-web站点管理数据库及web显示命令执行结果
- Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程
- 记一次服务器宕机后数据库恢复的过程
- python查询数据库,打印查询结果过程中出现'NoneType' object is unsubscriptable
- C#连接数据库sqlserver2005,执行sql,得到SqlDataReader结果的实例
- 适用不同数据库的、可执行存储过程的DBHelper类
- Linux+Qt 下 tar 命令在GUI下执行,过程过程和结果信息捕捉
- 记一次windows下物理迁移数据库的过程