1. ホーム
  2. mysql

[解決済み] MySQL テーブルのテーブルレベルロック待ち

2022-02-14 04:52:04

質問

ここ数日、不定期に私のウェブサイトが非常に遅くなることがあります。私はできる限りの調査を開始しました。私は、MySQL プロセスが私のサーバーの利用可能なメモリの 85 ~ 95% を使用していることを確認しました(メモリもアップグレードする必要がありますか)。

MySQLのプロセスログを確認したところ、膨大なクエリのリストがあることに気づきました。

<ブロッククオート

テーブルレベルのロック待ち

しかし、私が気づいたのは、これらのクエリで "テーブルレベルロック" が付いているのは、すべて users .

他にも20のテーブルがあり、一定のクエリを持っていますが、リストには表示されません。つまり、問題はusersテーブルにあるのではないでしょうか?

テーブルを改善し、最終的にテーブルレベルのロックを解除する方法を知りたいのですが?

また、こんなことも実行しました。

SHOW VARIABLES LIKE 'query_cache%';

その結果、こうなった。

query_cache_limit
1048576
query_cache_min_res_unit
4096
query_cache_size
33554432
query_cache_type
ON
query_cache_wlock_invalidate
OFF

データベース/mysqlを改善するためにできることを教えてください。

プロセスの一覧です。

   | 228 | db_user | localhost | db_db| Query          |    5 | Waiting for table level lock | SELECT count(*) FROM users WHERE createtime>'1396411200' OR createtime='1396411200'                  |
    | 229 | db_user | localhost | db_db| Query          |    4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use |
| 203 | db_user | localhost | db_db| Query          |    6 | Waiting for table level lock | SELECT SUM(cashedout) FROM users                                                                     |
| 204 | db_user | localhost | db_db| Query          |    4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use |
| 205 | db_user | localhost | db_db| Query          |    1 | Waiting for table level lock | SELECT * FROM users WHERE id='12055'                                                                 |
| 206 | db_user | localhost | db_db| Query          |    2 | Waiting for table level lock | SELECT * FROM users WHERE id='22530'                                                                 
| 197 | db_user | localhost | db_db| Query          |    3 | Waiting for table level lock | SELECT * FROM `users` WHERE `username` = 'ptc4life123' LIMIT 1                                       |
| 200 | db_user | localhost | db_db| Query          |    3 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0050' WHERE use |

基本的にロックされたプロセスはすべてこのような状態になっています。

解決方法は?

低速時にこのコマンドを実行してください。

show processlist;

これにより、実際に実行されているSQLコマンドと、インデックスを追加するための場所が表示されます。 可能であれば、最も長く実行されているSQLを投稿してください。

インデックスを追加すると、このようになります。

 ALTER TABLE MYTABLE ADD INDEX idx_columnname (COLUMN_NAME ASC) ;

しかし、制作期間中にそれをしないように気をつけたいものです。 一見すると、userテーブルのID列とusername列で行いたいところです。