Mysqlロックテーブルの問題とsql最適化

1344 ワード

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;