私は今、開発したWMSシステムの保守運用をしています。(社会人3年目 客先常駐)
行う業務は主に5つです
1.エラー発生時の調査・報告・対応指示
2.ユーザー様からのシステム問い合わせ対応
3.ユーザー様のオペレーションミスやシステム不具合で発生したデータに対するリカバリ作業
4.各種マスタデータの修正作業
5.各月の棚卸対応
今回は1で遭遇した事象について記載します。
エラー調査時、SQLを使ってデータ調査しますが、クエリのパフォーマンス等気にせず作成し実行しました。
最終的には実行結果が返ってきましたが、レスポンスが遅いクエリは、サーバに負荷をかけるため避けたいです。
【原因】
・インデックス設定しているのにそれを使わなかったため、フルスキャンしたためパフォーマンスが落ちた。
【対策】
・検索条件でインデックスカラムを適切に使用
インデックスカラムを適切に使うことで、フルスキャンを避け、パフォーマンス向上につながりました。
今後はインデックス設定しているカラムを意識してクエリを作成しようと思います。
もしクエリ結果が返ってこない場合、影響が出そうな場合はプロセスIDを確認してkillすることもできるようです。
killするにはIDが必要です。show processlistで確認できます。
show processlist について、使ったことがなかったためついでに学習しました。
私が理解できた部分を記載します。※浅い知識ですのであしからず。
抽出される項目は以下8つ
・ID・・・接続ID
・User・・・実行したMySQLユーザ
・HOST・・・接続しているホスト名
・DB・・・DB名。選択していなければNULL
・COMMAND・・・実行しているコマンドの種類
・TIME・・・コマンドの状態になってからの経過時間(秒)
・STATE・・・現在の状態
・INFO・・・SQLなどの実行している内容。実行していない場合はNULL
Commandステータス(ほかにもいろいろありますが2つ記載します。)
Sleep・・・SQLクライアントが新しいSQLステートメント(クエリ)の実行を待機している状態(セッションアイドル状態)。
Query・・・クエリを実行している状態
Stateの内容(ほかにもいろいろありますが3つ記載します。)
Sending to client・・・サーバーがクライアントにパケットを書き込んでいます。
executing・・・クエリの実行を開始
Updating・・・更新処理中(※ロック解除待ち状態のときや、更新中はこのStateになる)
気になる方は公式ページをご参照ください
Commandの値について
MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.14.2 スレッドのコマンド値
https://dev.mysql.com/doc/refman/8.0/ja/thread-commands.html
Stateの値について
MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.14.3 一般的なスレッドの状態
https://dev.mysql.com/doc/refman/8.0/ja/general-thread-states.html