MySQL の速度が遅いときの調査方法と高速化のテクニックを紹介します。
データベースの速度改善には、SQL の改善・サーバー改善の2つのアプローチがあります。
⇒ MySQL 8 のインストール手順 (CentOS)
⇒ MySQL 8 のインストール手順 (Ubuntu)
MySQL のスロークエリで原因を調べる
初めに、SQL クエリを見直す方法について紹介します。
データベースにデータを追加したり取り出す際には、SQL と呼ばれる言語を使用します。
SQL は書き方ひとつでパフォーマンスが大きく変わることがよくあります。
MySQL には、パフォーマンスの悪い(速度の遅い)SQLクエリを見つけるために
「スロークエリ」と呼ばれるログ機能が搭載されています。
秒単位で基準値を設定でき、基準値より処理が長いクエリを記録してくれます。
「3秒」に設定した場合は、処理に3秒以上要したクエリが記録対象です。
スロークエリを解消することが、データベース高速化の第一歩です。
MySQL(データベース)の負荷を下げられる他、アプリケーションの高速化にも繋がります。
MySQL のクエリを改善して高速化
上記のスロークエリで遅い SQL を発見したら、クエリの改善を実施しましょう。
SQL クエリのパフォーマンス改善には様々な方法がありますが、主な点は以下の通りです。
- 必要なカラムのみを取得する(
SELECT *
を利用しない) - 取得するデータを絞り込む(
WHERE
句を活用する) - テーブル結合時はなるべく行数を絞り込む
- 文字列検索で前方一致を使用しない(
LIKE
句の先頭に%
を付けない) ORDER BY
やGROUP BY
を必要以上に多用しない- インデックスを適切に設定する
- インデックスが効いているカラムに関数(CAST, FORMATなど)を適用しない
可能であれば、テーブル設計の段階から上記を考慮できるとベストです。
MySQL の設定を見直して高速化
MySQL サーバー側の設定を見直すことでも、パフォーマンス改善が見込めます。
innodb_file_per_table
を有効化する
このオプションを有効にすると、テーブル単位でデータを分割管理するようになります。
初期値では全データが一箇所で管理されてしまうため、有効化することをオススメします。
クエリキャッシュを有効化する
同じ SQL が何度も使用される場合には非常に有効です。
一度実行した SQL の結果をキャッシュしておくため、2回目以降の応答時間が短縮されます。
スレッドキャッシュを有効化する
データベースに対して、頻繁に接続や切断が発生する場合に有効です。
接続時に使用するスレッドを使い回すことで、サーバー負荷の軽減を図れます。
まとめ
MySQL データベースが遅い場合の調査方法と高速化テクニックを紹介しました。
SQL クエリの改善、サーバー設定の見直しといった2パターンがあり、どちらも重要な要素です。
データベースが全体的に遅い場合はサーバー側の設定、
特定の処理のみ遅い場合は SQL クエリの改善から先に着手することをオススメします。
【関連記事】
⇒ MySQL のクエリ結果を整形して見やすくする
⇒ AWS の「RDS」と「EC2 + MySQL」を比較
⇒ Aurora エンドポイントの使い分けを解説