记录的是一次微信小程序上线后有一条SQL语句卡在了tomcat日志不走的原因。
进入小程序首页执行着一条这样的SQL,如下:
SELECT
count(*)
FROM
`ledger_gather` lg,
disabled_person dp
WHERE
lg.id_card = dp.idcard
AND dp.community_code LIKE CONCAT(11, '%')
很简单,就是两张表进行inner join 查询出一个总数,关联条件为身份证,条件是一个区划编码(不必在意)。
发现的问题:
首先是tomcat服务器卡死,一直卡在一条SQL语句不往下执行,导致程序都无法运行。
着手查找问题所在:
刚开始我拿到这条SQL 在数据库执行了一下 超级慢(此时我也不知道问题所在),后来通过查询资料 “如何查看mysql数据库正在执行的SQL”
select * from information_schema.`PROCESSLIST` where info is not null;
或者
show processlist
来查看执行情况:
具体的字段含义(偷个懒)https://www.jb51.net/article/158497.htm
当我执行完后看到数据库已经积压到58条同样的sql就是上面的sql,而且time还在增长,导致后面的查询统统卡死。
解决过程:
首先通过kill id; 的命令将50多条sql全部杀死。
然后去看这两张表的设计,居然有一张表没有加主键(我的天),而且之前加主键或者索引的时候会把Navicat给卡死,现在解决掉之后再去加那是非常的快。
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 添加主键索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 添加普通索引
在添加了关联条件的索引和查询字段的索引后 ,卡死的问题解决了,查询也快了,上面的那条sql 也不会在mysql执行情况中堆积了。
这真是第一次解决这样的问题,应该是属于数据库方面或者优化的问题了吧,不懂的还有很多,持续学习中,有不当之处请大佬指点,不胜感激。蟹蟹。