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;

你可能感兴趣的:(Mysql锁表问题及sql优化)