MySQLクエリをトラブルシューティングする方法
データに対してクエリを発行し始めると、ユーザーが問題に遭遇することがあります。 MySQLを含む一部のデータベースシステムでは、次の例のように、クエリを完了するには、のクエリステートメントをセミコロン(;
)で終了する必要があります。
SHOW * FROM table_name;
クエリの最後にセミコロンを含めなかった場合、セミコロンを入力してENTER
を押してクエリを完了するまで、プロンプトは新しい行に続きます。
一部のユーザーは、クエリが非常に遅いことに気付く場合があります。 どのクエリステートメントがスローダウンの原因であるかを見つける1つの方法は、MySQLのスロークエリログを有効にして表示することです。 これを行うには、MySQLサーバーのオプションを構成するために使用されるmysqld.cnf
ファイルを開きます。 このファイルは通常、/etc/mysql/mysql.conf.d/
ディレクトリに保存されます。
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
次の行が表示されるまでファイルをスクロールします。
/etc/mysql/mysql.conf.d/mysqld.cnf
. . . #slow_query_log = 1 #slow_query_log_file = /var/log/mysql/mysql-slow.log #long_query_time = 2 #log-queries-not-using-indexes . . .
これらのコメントアウトされたディレクティブは、遅いクエリログのためのMySQLのデフォルト設定オプションを提供します。 具体的には、それぞれが行うことは次のとおりです。
slow-query-log
:これを1
に設定すると、遅いクエリログが有効になります。slow-query-log-file
:これは、MySQLが遅いクエリをログに記録するファイルを定義します。 この場合、/var/log/mysql-slow.log
ファイルを指します。long_query_time
:このディレクティブを2
に設定すると、完了するまでに2秒以上かかるクエリをログに記録するようにMySQLが構成されます。log_queries_not_using_indexes
:これは、インデックスなしで実行されるクエリもすべて/var/log/mysql-slow.log
ファイルに記録するようにMySQLに指示します。 この設定は、遅いクエリログが機能するために必要ではありませんが、非効率的なクエリを見つけるのに役立ちます。
先頭のポンド記号(#
)を削除して、これらの各行のコメントを解除します。 セクションは次のようになります。
/etc/mysql/mysql.conf.d/mysqld.cnf
. . . slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 2 log_queries_not_using_indexes . . .
注: MySQL 8以降を実行している場合、これらのコメント行はデフォルトではmysqld.cnf
ファイルに含まれません。 この場合、ファイルの最後に次の行を追加します。
/etc/mysql/mysql.conf.d/mysqld.cnf
. . . slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 2 log_queries_not_using_indexes
遅いクエリログを有効にした後、ファイルを保存して閉じます。 次に、MySQLサービスを再起動します。
sudo systemctl restart mysql
これらの設定を適切に行うと、遅いクエリログを表示して、問題のあるクエリステートメントを見つけることができます。 次のように、less
を使用してこれを行うことができます。
sudo less /var/log/mysql_slow.log
速度低下の原因となるクエリを特定したら、 MySQLおよびVPS上のMariaDBのクエリとテーブルを最適化する方法に関するガイドが、それらの最適化に役立つ場合があります。
さらに、MySQLにはEXPLAIN
ステートメントが含まれており、MySQLがクエリを実行する方法に関する情報を提供します。 MySQLの公式ドキュメントのこのページは、EXPLAIN
を使用して非効率的なクエリを強調する方法についての洞察を提供します。
基本的なクエリ構造を理解するためのヘルプについては、MySQLクエリの概要を参照してください。