MySQLの標準ストレージエンジンは、MyISAMです。 これを InnoDBに変更するとMTの再構築が速くなった事例があるそうです。
ネタ元はこちら。
[N] ネタフルのMT再構築が劇的に速くなったレシピはコレ!
ということで今回、奏効したレシピはこんな感じです。
・ストレージエンジンをMyISAMからInnoDBに変更する
・InnoDBのバッファプールのキャッシュ率を高めるようにmy.cnfの設定 (innodb_buffer_pool_size) を変更する
「ストレージエンジンをMyISAMからInnoDBに変更」したのが大きいみたいですね。
ストレージエンジンというのは、データへのアクセスを制御するところのようで、これを変更してキャッシュをチューニングしたところ、それまで7時間以上かかっていた個別エントリーの再構築が‥‥
30分になっちゃったんです!!!
サイト全体でも約1時間と、とんでもない高速化を果たしたネタフルのMovable Typeのリビルド(再構築)なのでした。
さっそくやってみましょう。
まず、/var/db/mysql/my.cnf の以下の部分をコメント解除します。
# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = /var/db/mysql/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/db/mysql/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
InnoDBのチューニングに関しては、
MTを使ったサイト構築テクニック (2): ネタフルにおける再構築チューニング - techknow.cool-solutions.jp
加えて、InnoDBのパフォーマンスチューニングをあわせて実行します。innodb_buffer_pool_read_requestsとinnodb_buffer_pool_readsの値を見つつ、innodb_buffer_pool_sizeの値を変更していきます。innodb_buffer_pool_sizeを16MBにすると、98%とヒット率が高くなることがわかってきました。
ということなんですが、元が my-large.cnf なので値がちょっと大きすぎるかもしれません。 とりあえずは、このまま行ってみます。
編集が終わったら、MySQLを再起動させます。
続いて、以下の内容のファイル(trans_innodb.sql)を作成しました。
USE `(MTのデータベース名)`;
ALTER TABLE `mt_as_ua_cache`  ENGINE = InnoDB;
ALTER TABLE `mt_asset`  ENGINE = 'InnoDB';
ALTER TABLE `mt_asset_meta`  ENGINE = InnoDB;
ALTER TABLE `mt_association`  ENGINE = InnoDB;
ALTER TABLE `mt_author`  ENGINE = InnoDB;
ALTER TABLE `mt_author_meta`  ENGINE = InnoDB;
ALTER TABLE `mt_author_summary`  ENGINE = InnoDB;
ALTER TABLE `mt_blog`  ENGINE = InnoDB;
ALTER TABLE `mt_blog_meta`  ENGINE = InnoDB;
ALTER TABLE `mt_category`  ENGINE = InnoDB;
ALTER TABLE `mt_category_meta`  ENGINE = InnoDB;
ALTER TABLE `mt_comment`  ENGINE = InnoDB;
ALTER TABLE `mt_comment_meta`  ENGINE = InnoDB;
ALTER TABLE `mt_commentsubscriptions`  ENGINE = InnoDB;
ALTER TABLE `mt_config`  ENGINE = InnoDB;
ALTER TABLE `mt_entry`  ENGINE = InnoDB;
ALTER TABLE `mt_entry_meta`  ENGINE = InnoDB;
ALTER TABLE `mt_entry_rev`  ENGINE = InnoDB;
ALTER TABLE `mt_entry_summary`  ENGINE = InnoDB;
ALTER TABLE `mt_ext_bl_group`  ENGINE = InnoDB;
ALTER TABLE `mt_ext_bl_groupmap`  ENGINE = InnoDB;
ALTER TABLE `mt_ext_bl_item`  ENGINE = InnoDB;
ALTER TABLE `mt_ext_bl_log`  ENGINE = InnoDB;
ALTER TABLE `mt_ext_bl_permission`  ENGINE = InnoDB;
ALTER TABLE `mt_ext_bl_source`  ENGINE = InnoDB;
ALTER TABLE `mt_ext_bl_update`  ENGINE = InnoDB;
ALTER TABLE `mt_field`  ENGINE = InnoDB;
ALTER TABLE `mt_fileinfo`  ENGINE = InnoDB;
ALTER TABLE `mt_ipbanlist`  ENGINE = InnoDB;
ALTER TABLE `mt_log`  ENGINE = InnoDB;
ALTER TABLE `mt_mailform_setting`  ENGINE = InnoDB;
ALTER TABLE `mt_notification`  ENGINE = InnoDB;
ALTER TABLE `mt_objectasset`  ENGINE = InnoDB;
ALTER TABLE `mt_objectscore`  ENGINE = InnoDB;
ALTER TABLE `mt_objecttag`  ENGINE = InnoDB;
ALTER TABLE `mt_permission`  ENGINE = InnoDB;
ALTER TABLE `mt_placement`  ENGINE = InnoDB;
ALTER TABLE `mt_plugindata`  ENGINE = InnoDB;
ALTER TABLE `mt_profileevent`  ENGINE = InnoDB;
ALTER TABLE `mt_profileevent_meta`  ENGINE = InnoDB;
ALTER TABLE `mt_role`  ENGINE = InnoDB;
ALTER TABLE `mt_session`  ENGINE = InnoDB;
ALTER TABLE `mt_stats`  ENGINE = InnoDB;
ALTER TABLE `mt_statwatchconfig`  ENGINE = InnoDB;
ALTER TABLE `mt_tag`  ENGINE = InnoDB;
ALTER TABLE `mt_tbping`  ENGINE = InnoDB;
ALTER TABLE `mt_tbping_meta`  ENGINE = InnoDB;
ALTER TABLE `mt_template`  ENGINE = InnoDB;
ALTER TABLE `mt_templatemap`  ENGINE = InnoDB;
ALTER TABLE `mt_template_meta`  ENGINE = InnoDB;
ALTER TABLE `mt_template_rev`  ENGINE = InnoDB;
ALTER TABLE `mt_touch`  ENGINE = InnoDB;
ALTER TABLE `mt_trackback`  ENGINE = InnoDB;
ALTER TABLE `mt_ts_error`  ENGINE = InnoDB;
ALTER TABLE `mt_ts_exitstatus`  ENGINE = InnoDB;
ALTER TABLE `mt_ts_funcmap`  ENGINE = InnoDB;
ALTER TABLE `mt_ts_job`  ENGINE = InnoDB;
これを
www# mysql < /var/db/mysql/trans_innodb.sql
と実行させればいいみたいです。
エラーもなく実行できたようですが、どう変わったのかはよくわかりません。 記事数が7,800程度では、体感できるほどの効果はないかもしれません。
「InnoDBはMyISAMよりもマシンパワーの影響が大きい」という話も聞きますので、atom程度のCPUでは逆効果かもしれませんしね。
でも、遊びとしては面白いと思います。 こういうことを通じて、RDBMSについての理解を深めていきたいですね。