Mysqlロックテーブルの問題とsql最適化
1344 ワード
Mysqlロックテーブルクエリーとロック解除操作
1、データベース操作を行う時、自分の不注意やプログラム設計上の欠陥によってロックテーブルが発生する場合があります.mysqlでロックテーブルを表示し、ロックを解除する手順は以下の通りです.
2、もう一つのクエリーロック方法
問題:このクエリ文はロックテーブルの問題を引き起こし、最適化されます.
ロック・テーブルが発生した理由:複数のテーブルがクエリーを結合する場合、whereとandの組合せを使用してクエリーを行うとデカルト積スキャンが発生します.
解決策:join接続を使用し、ba.*を使用しないでください.
最適化されたsql文:
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;