MySQLのストレージエンジンをInnoDBに変更する

  • 投稿日:
  • by
  • カテゴリ:

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