1. ここは注意、[mysqld]に記述するcharacter-setの設定方法が変わりました。
従来、[mysqld]の設定には"default-character-set=utf8"と書いていましたが、5.5系からは"character-set-server=utf8"に変更になりました。しかし、他の設定項目では未だに"default-character-set=utf8"が利用できます。なんでなのかは知りませんw とりあえず、"character-set-server=utf8"になったのだと覚えましょう。
また、この設定をしない、つまりデフォルトではMySQLの文字コードはUTF-8ではなく、Latin1になりマルチバイト文字(要は日本語とか)はバイナリーとして扱われます。普通に使っているぶんには問題無いのですが、検索をかけるさいバイナリーとして検索されるため、誤った検索結果が返ってくる事があります。Movable Typeなど、UTF-8前提で作られている物のデータベースとして使うなら、文字コードは明示的にUTF-8と宣言しておきましょう。
2. クライアントの意向関係無しに必ずUTF-8で返答する
この設定は以前からありますが、クライアントが悪さをすると本来UTF-8で返答するはずが、別のコードに変換され文字化けの原因となってしまいます。
ですので、クライアントがどう要求してこようが必ずUTF-8で返答するよう"skip-character-set-client-handshake"を追加しましょう。これで、どんな要求が来ても文字コードを変換せずUTF-8で応答を返します。
3. データベースは必ずInnoDBに!!
デフォルトでインストールすると、データベースはMyISAMで作成されます。MyISAMもきちんとチューニングをすれば遅くはないのですが、自分が試したところMovable TypeではMyISAMよりもInnoDBの方が相性が良いのか再構築などにかかる時間が短くなります(最高で70%速くなった事例もありました)
また、この後に述べるInnoDBの機能も使いたいので、デフォルトのデータベースはInnoDBにしましょう。実はMyISAMでデータベースを作成してもALTER TABLEを使ってデータベースエンジンを変更することは出来るのですが、ここでは取り上げません。(また、どこかで書くかも)
実際にデフォルトのデータベースエンジンをInnoDBにするには"default-storage-engine=innodb"と追記します。
4. コレーションは明示的に指定しよう!!
そもそも「コレーションって何?」という話ですが、データベースの並び順を決定する物、とでも思って下さい。この設定でソートする時の表示順が変わってきます。
もちろんデフォルトのままでもコレーションは決まって居るので放置でも良いのですが、他のMySQLサーバーにインポートした場合や、レプリケーションを取っている場合にコレーションが違っていると、ORDER BY句を使った表示順や通常の表示順にゆれが出て、同じ結果にならない場合が出てきます。
そこで明示的にコレーションを指定することで、表示順のゆれをなくします。データベースをUTF-8で作成しているので、コレーションの指定を"collation-server=utf8_general_ci"とします。
5. データベース圧縮したい!!
長期間運用し巨大になったデータベースを使っていると、だんだんと応答速度が遅くなっていきます。これは、データをSELECTしたりする際にディスクI/Oが発生しますが、その対象のファイルが大きいためディスクI/Oが増える為です。
これを押さえるため、MySQLのInnoDBではデータベースのバイナリーファイルを圧縮する機能を持っています。具体的には"innodb_file_format=Barracuda"と指定します。この指定をするために、先ほど「InnoDBにしたい!!」と説明したわけです。
しかし、データベースのバイナリーファイルを圧縮したり、展開したりしながらデータベース操作が行われるため、CPUパワーを食うのは明白です。ただし、MySQLのBarracudaではよく利用するデータは圧縮せずに展開したままにしたり、メモリー上に一時的に展開するなどするため、多少のCPUパワーと引き替えに十分なパフォーマンスを引き出してくれます。これに乗らない手はありませんw
ちなみに、この名前"Barracuda"ですがコードネームです。通常のフォーマットは"Antelope"で、"Zebra"までが既に予約されています。A -> B -> C -> ... とイニシャルがA to Zになっている訳ですね。この"Barracuda"ですが、5.1系では利用できません。InnoDBプラグインを組み込むと利用できるようになりますが、5.5系では素で入っているので、ここでも5.5系を利用する意味が出てきます。
6. テーブル毎にファイルを分けたい!!
Movable Typeを長期間運用していると、mt_logを筆頭にいろいろなテーブルが肥大化していきます。MySQL InnoDBはデータベースに対して1つのファイルを割り当てるため、テーブルの肥大化は、そのままデータベースの肥大化、つまりバイナリーデータベースファイルの肥大化を引き起こします。もちろん、"Barracuda"を使って圧縮をかけるという方法をとってはいますが、それだけではデータベースの超肥大化には太刀打ちできません。(意味が無いという訳ではないですよ、念のため)
そこで使いたいのが、これ。"innodb_file_per_table=1" これを設定すると、MySQLはInnoDBのバイナリーファイルをテーブル毎に分割してくれます。これを使えば必要なテーブルのファイルにアクセスするだけで済み、ディスクのI/O負荷も低減します。つまるところ、速度の向上が見込めるわけです。
中には「ファイルハンドラの無駄遣いだ」とおっしゃる御仁もいらっしゃいますが、少なくとも手元環境で調べた所、この"innodb_file_per_table=1"を設定する事でMovable Typeの挙動は速くなりました。設定して遅くなったら元に戻すことは簡単なので、「本当?」と疑ってる方は実際に試してみてはいかがでしょうか?
念のためですが、この設定は肥大化したデータベースでないと差がでません。初めて作ったMovable Typeのブログサイトで数記事程度しか無い場合は「無意味」とまでは言いませんが将来データベースが肥大化する前の保険として設定しておくのはアリだと思いますよ。
追記某氏から質問がありましたので、こちらにもアップデート。基本、新規にMySQLを立ち上げるときは、この"innodb_file_per_table"は必須です。ただ、既に作成されているデータベースに後からこの設定を追加しても、新規でテーブルを作成する時にしか、テーブル分割をしてくれません。これは従来のデータベースとの互換性を保つためです。既存のテーブルを分割する方法は色々とあるのですが、一番簡単なのは次の方法です。肥大化したデータベースの場合、この方法を使うとデフラグにもなるので一挙両得です。
- 対象のデータベースをmysqldumpなどでバックアップを取る
- 対象のデータベースをdropする
- "innodb_file_per_table=1"を設定に追加
- mysqldを再起動
- "mysql> show variables like 'innodb_file_per_table';" で設定がONになっている事を確認
- データベースを作成
- バックアップしたデータを、新しく作ったデータベースにimport
- テーブルが分割されていることを確認(例:# ls /var/lib/mysql/mtdb/)
結論
character-set-server=utf8
skip-character-set-client-handshake
default-storage-engine=innodb
collation-server=utf8_general_ci
innodb_file_format=Barracuda
innodb_file_per_table=1
実践ハイパフォーマンスMySQL 第2版 | |
Baron Schwartz Peter Zaitsev Vadim Tkachenko Jeremy D. Zawodny Arjen Lentz Derek J. Balling 伊藤 直也 (監訳) オライリージャパン 2009-12-14 売り上げランキング : 63997 Amazonで詳しく見る by G-Tools |