MySQLちょっと上級チューニング
MySQLのパフォーマンスに不安をお持ちのお客様に対し、 最適なパフォーマンス環境を引き出すサービスです。
»MySQLパフォーマンスチューニング 概要
お客様のシステム環境における課題事項を具体化し、最適な改善プランをご提案させて頂くサービスです。
»MySQLコンサルティングサービス 概要
- 動作状況の検証方法
- 時間のかかるSQLコマンドを特定したい場合、どうすればいいですか?
(MySQL4.0、4.1、5.0共通) my.cnfファイルに「log_slow_queries=ログファイル名」と記述します。デフォルトでは、実行に10秒以上かかった操作がこのログファイルに記録されます。実行時間を変更したい場合は、my.cnfファイルに「long_query_time=秒数」を追加すれば、記述した秒数を超えた操作がログファイルに記録されます。 - 実行時間のかかるクエリを改善するためにはどうすればいいですか?
(MySQL4.0、4.1、5.0共通) EXPLAINコマンドを使用します。Keyフィールドにコマンド実行時に使用されるインデックス、rowsフィールドにコマンド実行時に読み取ったデータ数が出力されます。作成インデックスがkeyフィールドに表示され、インデックスを使用しない場合よりも、rowsフィールドのデータ数が格段に少なくなっていれば、クエリ実行速度も上がります。 - 動作しているサーバの設定値、システム変数を見たい場合、どうすればいいですか?
(MySQL4.0、4.1、5.0共通) MySQLに接続した状態で、「SHOW VARIABLES LIKE ‘システム変数名’;」コマンドを実行します。 - 現在のサーバの動作状況を調べたい場合、どうすればいいですか?
(MySQL4.0、4.1、5.0共通) MySQL4.0、4.1では、MySQLに接続した状態で「SHOW STATUS LIKE ‘ステータス変数名’;」コマンドを実行します。MySQL5.0.2以上では、SHOW GLOBAL STATUS LIKE ‘ステータス変数名’;」を実行する必要があります。5.0.2からは仕様が変更され、GLOBALもしくはSESSIONというオプションが指定できるようになりました。オプション省略時はSESSIONが指定されたものと同じになるためMySQL5.0.2以降では、グローバルな情報を取得するには「SHOW GLOBAL STATUS LIKE ‘ステータス変数名’;」と明記する必要があります。
- 時間のかかるSQLコマンドを特定したい場合、どうすればいいですか?
- 設定ファイルのチューニング
- 同じSQLコマンドを実行する場合にパフォーマンスを向上させる方法はありますか?
(MySQL4.0、4.1、5.0共通) クエリキャッシュを使用してください。(MySQL4.0.1から有効)my.cnfファイルで「query_cache_type」をONに、「query_cache_size」を0より大きな適切な値に設定すれば、実行結果がクエリキャッシュ内に格納されますそして同一のSQLが発行された場合には、キャッシュ内の結果が返されます。 - アクセスをするたびにテーブルを開く負担を軽減するにはどうすればいいのですか?
(MySQL4.0、4.1、5.0共通) システム変数「table_cache」を大きくします。現在開かれるテーブルを示すステータス変数「Open_tables」に比べ、今まで開いたテーブルを示すステータス変数「Opened_tables」の値が著しく大きい場合、table_cacheの値を増やしてください。 - 多数のクライアントがアクセスする場合、接続にかかる時間を短縮するにはどうすればいいのですか?
(MySQL4.0、4.1、5.0共通) システム変数「thread_cache_size」を大きくします。。新たにクライアントが接続した場合、スレッドキャッシュからスレッドを利用し、キャッシュにスレッドがない場合、新たにスレッドが作成されます。接続数を示すステータス変数「Connections」の値と、作成されたスレッド数を示すステータス変数「Threads_created」の値を比較し、Threads_createdの値が大きい場合「thread_cache_size」を増やしてください。 - 大規模なトランザクション処理を実行する場合、パフォーマンス低下を防ぐ方法を教えてください。
(MySQL4.0、4.1、5.0共通) キャッシュに保存されるバイナリログのサイズを指定するシステム変数「binlog_cache_size」の値を増やしてください。 - インデックスがディスクから読み込まれるのを防ぎ、メモリから読み込まれるようにするにはどうすればいいのですか?
(MySQL4.0、4.1、5.0共通) システム変数「key_buffer_size」の値を増やしてください。「Key_reads」ステータス変数は、インデックスがディスクから読み込まれる量、「Key_read_request」ステータス変数は、インデックスが、ディスク、バッファのどちらかから読み込まれる量を示しますが、「Key_reads / Key_read_request」の値が1/100より大きい場合は、ディスクから読み込まれる量が多すぎるため、「key_buffer_size」の値をより大きな値に変更してください。 - 大量のデータが格納されたテーブルから連続した特定のデータのみを取り出すにはどうすればいいのですか?
(MySQL4.0、4.1、5.0共通) 例えば、上から20行読み飛ばして、21行目から30行を取得したい場合、「SELECT * FROM t1 LIMIT 20, 30;」と実行します。これにより、効率的にデータを取得できます。 - 二つのテーブルt1、t2を結合したSQL文をEXPLAIN文で見ています。MySQLサーバは、t2、t1の順番で結合していますが、どうもt1、t2の順番で結合した方が効率よく思われます。自分で結合順を指定することはできますか?
(MySQL4.0、4.1、5.0共通) 可能です。この場合、「SELECT STRAIGHT_JOIN * FROM t1,t2 WHERE ……;」と実行します。STRAIGHT_JOINを指定し、FROMの後ろのテーブル名を自分の結合したい順に並べることで、結合順を指定できます。 - 更新系のコマンドとSELECTコマンドを同時に実行する場合、通常、SELECTコマンドよりも、更新系のコマンドが優先されます。更新系のコマンドよりも、SELECTコマンドを優先したい場合どうすればいいですか?
(MySQL4.0、4.1、5.0共通) 「SELECT HIGH_PRIORITY ….;」と実行します。 - 大量のデータを挿入したい場合、INSERTコマンドを繰り返すようにコーディングしてしまいました。より速く処理する方法はありますか?
(MySQL4.0、4.1、5.0共通) 何度もINSERTコマンドを繰り返すのではなく、「INSERT INTO t1 VALUES(1,”aaa”), (2,”bbb”), (3,”ccc”)…..;」のようにマルチプルINSERTに書き換えて一度で済ませるようにします。 - 大量のデータを挿入したテーブルを全部消したいと思います。WHERE句なしのDELETEコマンドと、TRUNCATE TABLEコマンドではどちらが速いですか?
(MySQL4.0、4.1、5.0共通) TRUNCATE TABLEコマンドの方が高速です。ただし、削除行数はDELETEコマンドでは正しく表示されますが、TRUNCATEコマンドでは正しく表示されませんのでご注意ください。
- 同じSQLコマンドを実行する場合にパフォーマンスを向上させる方法はありますか?

