まめ畑

ゆるゆると書いていきます

MySQLのチューニングをしてみよう

自宅サーバMySQLが最近少し遅くなってきたので、パフォーマンスに関することに関して調べてみた。
間違ってるところもあるかもしれないけど、基本的にはこんな意味だと思う。
でも、自宅のMySQLの性能が下がったのは実験などでDBたくさん作りすぎたのと、アクセスログとかを突っ込んでるからと思われるけど。。。


以下の設定を/etc/my.cnfの[mysqld]内に書く。
必要なところだけでおk。
入っている数値は例なのでうまいこと調整する。

key_buffer = 20M
検索に使われるインデックスをバッファに保存する時のメモリサイズ


max_allowed_packet = 1M
入力データを保持するための最大バッファサイズ


table_cache = 256
頻繁にアクセスされるテーブルに対して使うデータキャッシュ(ディスクI/Oを減らせる)


sort_buffer_size = 1M
並べ替えのバッファサイズ(値を大きくすとORDER BYやGROUP BYといった並べ替えクエリーの速度を上げられる)


read_buffer_size = 1M
読み込みのバッファサイズ(値を大きくするとインデックスを含まないクエリーの実行速度を上げられる)


myisam_sort_buffer_size = 64M
MyISAMで使用する並べ替えのバッファサイズ


thread_cache = 4
スレッド生成のキャッシュサイズ(クライアントからの接続を受けるとスレッドが生成されて、スレッドがクライアントのSQL分を処理する)


query_cache_size= 4M
クエリのキャッシュサイズ(同じクエリを何度も実行する場合に効果あり)


thread_concurrency = 4
同時に実行するスレッド数


join_buffer_size = 131072
インデックスを使用しない場合の完全結合のバッファサイズ(インデックスが使用できない場合に有効)

こんな感じらしいです。
あくまで例なのでいじりながら性能のいいところを見つけてください。
何かいい方法があると思うのですが、わからなかったので徐々に変えながらあたりをつけていきました。
もちろん設定したらMySQLの再起動を忘れずに。



他にも性能を見る指標として、slow queryをログに出すことも有効です。
slow queryとは実行に時間のかかったQueryです。
これをログに吐き出させることでボトルネックになっているQueryを特定できます。


このログを有効にするには、同じくmy.cnfの[mysqld]に以下の記述をします。

log-slow-queries=/var/log/mysqld-slow.log
ログファイルを書き出す場所。
これは書き込み権限がつけれられればどこでもいいです。


long-query-time=5
ログに書き出す閾値(秒) この時間以上実行にかかったQueryを記録します。


書き出されるログはこんな感じです。

# Time: 080826 0:41:53
# User@Host: ID @ localhost [127.0.0.1]
# Query_time: 6 Lock_time: 0 Rows_sent: 5 Rows_examined: 2815774
実行されたSQL

  • Query_time 実行時間
  • Rows_sent 送信された行数
  • Rows_examined 走査した行数


こんな感じでしょうか?
もう少し調べないといけないです。。
explainでSQLも評価できますよ。