MYSQL业务查询卡顿无返回数据被锁怎么样优化

 前言:

   场景是:我们业务资讯系统系统场景,数据量在列表量2000万上下,详情信息6000万左右,标签信息表1亿4千万以上,每一次详情查询会进行查询三张表, 耗时基本上1.5秒左右,但是最近业务量飙升导致查询卡顿,用户业务操作员也激增好多人,导致钉钉群,经常被艾特,被吐槽怎么又卡顿了,然后预发布系统数据库容量和配置也受限,需要扩容,增加配置,集群,和分区配置。做好这些操作之后呢,但是我们这边还是卡顿想想出现了,所以需要我作为java开发进行处理优化!主要需要查询下怎么会卡顿呢?是不是SQL还有优化空间呢?还是说CRUD操作的遇到了锁和卡顿住了。

思路一:是不是某些SQL执行卡顿被锁耗时太久

1、查看下所有的SQL进程,目前正在执行的SQL语句,是否已经卡顿,被锁

show processlist;

运行之后的效果图如下,state如果出现大量的sleep说明,这个SQL目前在等待状态,最下面前面的SQL肯定有一条卡顿了!

MYSQL业务查询卡顿无返回数据被锁怎么样优化_第1张图片

2、找到这句耗时超久的SQL,进行kill掉。

 SELECT  *  from    tbm_news_info   ;

发现有一句SQL如上,卡顿了,主要这张表过亿,导致整个数据库CPU占用,耗光了资源,其他SQL进行了堵塞状态!

然后可以进行kill掉这个SQL进程就可以的!

kill  1514

3、通过批量的进行查询被锁住的SQL,进行kill掉堵塞的进程,可以解决数据库卡顿现象。

具体的SQL:


--  查询目前卡顿的进程,查询到那么直接删除掉,就可以恢复正常,解决卡顿问题
SELECT
trx_state,
trx_started,
trx_mysql_thread_id,
trx_query,
concat(
'kill ',
trx_mysql_thread_id,
';'
) as  '目前卡顿进程进行杀死'
FROM
information_schema.innodb_trx
ORDER BY
trx_started 
 limit 50  ;

MYSQL业务查询卡顿无返回数据被锁怎么样优化_第2张图片

 也可以进行查询用户的卡顿的SQL进程

SELECT
*
FROM
information_schema. PROCESSLIST a
WHERE
command <> 'sleep'
AND info LIKE 'select%'
AND time > 60
and user = 'tbm'
ORDER BY
time DESC

复制最后的一列数据然后进行批量的删除SQL进程就可以完美的解决数据库卡顿现象!

思路二:临时表设置过小,导致数据量太大的时候表空间无法使用

1、有些时候也是临时表设置很小导致空间受限,导致卡顿

show variables like "%tmp%";
-- 16777216
set global tmp_table_size=33554432;
-- 慢查询
show variables like '%quer%';
-- slow_query_log : 是否已经开启慢查询
-- slow_query_log_file : 慢查询日志文件路径
-- long_query_time :  超过多少秒的查询就写入日志 
-- log_queries_not_using_indexes 如果值设置为ON,则会记录所有没有利用索引的查询(性能优化时开启此项,平时不要开启)
 

通过上面的设置可以大小满足临时表的调用!

思路三:主要是数据库设置连接数太小,导致连接等待耗时

1、可以通过navicat 的mysql的客户端操作查询连接数设置,然后设置临时的连接数,这样也可以在某些情况下解决数据库连接卡顿的情况!

show variables like '%max_connections%';
set GLOBAL max_connections=400;

你可能感兴趣的:(MYSQL,2021-目前,工作,mysql,数据库,sql)