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についての理解を深めていきたいですね。