MySQL基本のチューニングでWordPressを速くする

WordPressがDBとしてMySQLを使用しているのは有名な事実ですが、とりあえず検証がてら使っているだけの場合はMySQLをチューニングせずに使っている人も多いかもしれません。WordPressを高速化する手法は色々とあるのですが、今回はとりあえず基本のMySQLチューニングだけ施して様子を伺ってみます。

ちなみに、単にチューニング済みのWordPress環境を手に入れたいだけでしたらEC2で網元を起動するのがお勧めです。
WordPress powered by AMIMOTO (PVM) on AWS Marketplace.
プロジェクトのサイトはこっち。
AWS + Nginx + WordPress | 超高速 WordPress AMI 網元.

というわけで、MySQLの基本のチューニングを入れてみます。基本というのはMySQLの開発元が奨励値を提示しているということ。CentOS 6.6だと /usr/share/mysql/*.cnf みたいなパスでファイルがあるはずです。それぞれのファイルの頭の方に奨励するメモリ容量が書いてあります。my-large.cnf で512M、my-huge.cnf で1Gから2Gってあたりが歴史を感じる。2Gメモリってもうhugeじゃないよね。

で、ちょっと試してみたいだけなら /etc/my.cnf にこんな感じで書いてやります。

!include /usr/share/mysql/my-large.cnf

このまま運用してもいいとは思うけど、個人的には設定ファイルは include してない方が読みやすいと思います。設定したらMySQLを再起動して反映させます。

何が変わったか確認。設定前後で SHOW VARIABLES の内容を取っておき、比較してみましょう。

 $ echo show variables | mysql -uroot -p > mysql-variables-before.txt
$ echo show variables | mysql -uroot -p > mysql-variables-after.txt
$ diff mysql-variables-{b,a}* --side-by-side | grep \| | sed -e 's/\t\+/ /g'
binlog_format STATEMENT       | binlog_format MIXED
ft_boolean_syntax + -><()~*:""&| ft_boolean_syntax + -><()~*:""&|
key_buffer_size 8384512       | key_buffer_size 268435456
log_bin OFF       | log_bin ON
myisam_sort_buffer_size 8388608       | myisam_sort_buffer_size 67108864
pseudo_thread_id 7       | pseudo_thread_id 5029
query_cache_size 0       | query_cache_size 16777216
read_buffer_size 131072       | read_buffer_size 1048576
read_rnd_buffer_size 262144       | read_rnd_buffer_size 4194304
server_id 0       | server_id 1
sort_buffer_size 2097144       | sort_buffer_size 1048576
table_open_cache 64       | table_open_cache 256
thread_cache_size 0       | thread_cache_size 8
timestamp 1431665813       | timestamp 1431665584
version 5.1.73       | version 5.1.73-log

ってな感じです。見づらいね。

見づらいので重要な部分を抜粋して説明します。

  • key_buffer_size: 全スレッドで共有されるMyISAMテーブルのインデックスキャッシュ
  • myisam_sort_buffer_size: MyISAMテーブルのインデックスをソートする時のバッファ
  • query_cache_size: クエリーキャッシュのサイズ
  • read_buffer_size: MyISAMシーケンシャルスキャン用のバッファ、だけど他にも使われる
  • read_rnd_buffer_size: スレッドごとの読み込みバッファ
  • sort_buffer_size: ソート時に割り当てるバッファサイズ
  • table_open_cache: 全スレッドで同時に開けるテーブルの数
  • thread_cache_size: スレッド再利用のために待機する数

MyISAMテーブルのための項目が多いです。InnoDB関連の項目はコメントアウトされているので、必要に応じて有効化しましょう。当方のMySQLはMyISAMで構築していたのでInnoDB関連の項目はコメントアウトしたままです。うっかりだな。InnoDBの方が良さそうだけど、WordPressはエンジンとか気にしないらしい。いずれInnoDBに変更するか。

これでそこそこ大きいメモリを有効に利用できるようになったと思われます。実際はどうなんでしょう。以前に設定した microtime_log で調査します。
Apacheでリクエストを処理するのにかかった時間を継続的に記録する | 曖昧/旬.
ちなみにこれ、時刻も入れました。こんな感じです。

CustomLog /srv/imys.la/logs/microtime_log "%{%F,%T}t %D %U" env=!no_microtime_log

このログで設定変更前と後でのサイトトップを出力するのにかかった時間の平均値を出しました。

$ for i in 09 10 11 12 13 14; do awk '/^2015-05-'$i',2.* \/shun\/index.php$/{t=t+$2;n=n+1}END{print '$i',n,t/n/1000/1000}' /srv/imys.la/logs/microtime_log; done
9 12 0.545624
10 11 0.508112
11 7 0.52443
12 12 0.488955
13 14 0.431223
14 21 0.355607

左から日付、アクセス数、時間、です。アクセス数が少なすぎて信頼性は低いかもしれないですね。20時以降に限定しているのは、自分が作業していない時間帯だからです。今日は作業してる。設定変更したのは12日の日中なので、設定変更後は二割ほど時間が短くなっていることになります。そんなに効くか。

ちなみに、この参考設定ファイル、5.6.8より前のバージョンにしか同梱されていないようです。

Before MySQL 5.6.8, MySQL distributions include several sample option files that can be used as a basis for tuning the MySQL server.
情報源: MySQL :: MySQL 5.6 Reference Manual :: 5.1.2.2 Using a Sample Default Server Configuration File.

残念だね。