オープンソース/Linux

オープンソース

ITpro

[MySQLウォッチ]第14回 サーバー設定を見直してMySQLの性能を引き出す

初歩的なMySQLサーバーのチューニング

 本来,データベースのチューニングとは,データベースの構造と処理内容に基づいて行うものである。これは,非常に高度で時間のかかる作業である。しかし,その部分に手をつける前に行わなくてはいけない初歩的なチューニングも存在する。ここでは,そのような初歩的な設定内容を紹介する。

  • メモリー

     MySQLサーバーのパフォーマンスが悪い場合,最初に確認するのはメモリーの割り当てだ。そのマシンに搭載されているメモリーが大きいほど,MySQLサーバーに割り当てる量を大きくすることをお勧めする。「mysqld --help」で表示されるkey_buffer_sizeを確認してほしい。出力例では,key_buffer_sizeは,デフォルト状態となっており,約8MBである。MySQL ABでは,マシンに搭載しているメモリーの1/4を推奨値としている。

    
    リスト5●key_buffer_sizeの出力例(mysqld --helpまたはshow variables)
    
    key_buffer_size                   8388572
    

     key_buffer_sizeを調整する指標として,キャッシュ・ミス率がある。キャッシュ・ミス率は,Key_reads / Key_read_requestsで算出可能だ。キャッシュ・ミス率は,0.003より小さい値となるのが理想である。key_buffer_sizeを大きくすることで,キャッシュ・ミス率を改善できる。

     key_buffer_sizeは,全コネクション(クライアントからの接続)から共通で使用する。それに対して,read_buffer,read_rnd_buffer,sort_buffer,join_bufferは,コネクションごとに使用されるバッファだ。そのため,大きくすることによって,パフォーマンスが向上するが,コネクションが多いMySQLサーバーでは注意が必要だ。

  • テーブル・キャッシュ

     MySQLのデータベースは,ファイルとして格納されています。とくにMyISAMタイプのテーブルは,3つのファイルから構成されるので一つのテーブルにアクセスすると3つのファイルが開かれる。MySQLサーバーでは,一度開いたファイルのポインタをtable_cacheに保存して,次回からのアクセスを高速化する。

    
    リスト6●table_cacheの出力例(mysqld --helpまたはshow variables)
    
    table_cache                       64
    

     Table_cacheの値を大きくすることで,より多くのテーブルのアクセスが高速化される。Opened_tablesの値が大きい場合には,table_cacheの増加を検討する。

  • スレッド・キャッシュ

     スレッドとは,クライアントからのリクエストを処理するためのプロセスだ。デフォルトでは,クライアントのコネクション(接続)ごとにスレッドを生成し,コネクションの接続が切断されるとスレッドも消滅する。Threads_cacheは,不要になったスレッドをプールして再利用するための機能だ。thread_cache_sizeは,キャッシュするスレッド数を指定する。デフォルトは,0なのでスレッドのキャッシュを行わない。

    
    リスト7●thread_cache_sizeの出力例(mysqld --helpまたはshow variables)
    
    thread_cache_size               8
    
     Threads_created,Threads_connected,Threads_runningのいずれかが大きい場合には,Threads_cacheを大きくすることで,スレッド生成を減らして接続時のレスポンスを向上できる。

  • コネクション

     チューニングとは逆に,性能を維持するためにコネクション(クライアントの接続)を抑制するのがmax_connectionsの値だ。デフォルトでは100,すなわち同時に100コネクションが可能になっている。

    
    リスト8●max_connectionsの出力例(mysqld --helpまたはshow variables)
    
    max_connections                   100
    

     コネクションが100を越える場合には,この値を増やす必要がある。ただし,むやみに増やすと,多数のコネクションにより,パフォーマンスの低下を生じる危険性がある。

     このように,MySQLサーバーのチューニングの最初の一手は,どのようにメモリーを割り当てるかと言う点である。ここで紹介したチューニングを行い,改善されないのであれば,MyISAMやInnoDBに関するシステム変数の調整に進むべきであろう。それでも改善されないのであれば,いよいよデータベース構造やSQLステートメントのチューニングを行う必要があるだろう。もちろん,ネットワークやサーバー・ハードウエアなど,MySQL以外の要因も疑うことを忘れてはいけない。

    佐藤栄一(Satoh Eiichi)

    ■著者紹介 佐藤栄一(さとうえいいち)
    ゼンド・ジャパン株式会社 アーキテクト MySQL担当。PHPのコア技術者が設立したイスラエルZend Technologiesと提携関係にあり,Zend製品の販売,サポートおよびLAMPおよびLAPPによるシステム構築を推進しているMySQL ABのリセーラとしてライセンス,サポート,コンサルティングの提供を行っている。

  •  [2005/02/14]

    この記事に対する読者コメント

    コメントに関する諸注意 コメント投稿 コメント一覧