Mysql锁表问题及sql优化

Mysql锁表查询和解锁操作

1、在做数据库操作时,有时会因为自己的粗心或者程序设计上的缺陷导致锁表,在mysql中查看锁表和解锁的步骤如下:
 //1.查看当前数据库锁表的情况
    SELECT * FROM information_schema.INNODB_TRX;
    
 //2.杀掉查询结果中锁表的trx_mysql_thread_id
    kill trx_mysql_thread_id
2、另外一种查询锁方法
1、查询是否锁表
    show OPEN TABLES where In_use > 0; 
2、查询进程
    show processlist
    查询到相对应的进程===然后 kill    id
    补充:
    查看正在锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 
    查看等待锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

遇到的问题:
这个查询语句导致了锁表问题,对它进行优化

SELECT ba.*,ac.IsEffective
FROM TB_YX_BASE_ACTIVATION ba,TB_YX_ACTIVATION_CODE ac
WHERE ba.Id = ac.BaseActivationId AND ba.`Status` = 2 AND ac.IsEffective < 3;

发生锁表的原因:
多表联合查询时,使用where和and组合进行查询会导致笛卡尔积扫描

解决方式:
使用join连接,并且不要使用ba.*

优化后的sql语句:


SELECT ba.Id,ba.`Type`,ba.NewUserOnly,ba.Name,ba.Channel,ba.CodeCount,ba.CodePrefix,ba.ActiveCount,ba.`Status`,ba.ValidStartTime,ba.ValidEndTime,ba.CreatUser,
ba.UpdateUser,ba.CreateTime,ba.UpdateTime,ba.IsEdit,ac.IsEffective
FROM TB_YX_BASE_ACTIVATION ba
LEFT JOIN TB_YX_ACTIVATION_CODE ac ON ba.Id = ac.BaseActivationId
WHERE ba.`Status` = 2 AND ac.IsEffective < 3;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值