s_tajima:TechBlog

渋谷で働くインフラエンジニアのTechブログです。

MySQLのinnodb_file_per_tableについての検証

背景

innodb_file_per_tableを有効にしている場合に、
テーブル数が多くなるとMySQLの起動/停止や、innodbのクラッシュリカバリに時間がかかるようになるとの噂を聞いたので、
その辺りを含めた簡単な検証をしてみたメモ。
あまりしっかりとした調査はしていないので参考程度に。

尚、innodb_file_per_tableについての説明は割愛。

検証環境

検証した環境は、

実運用サービスの開発機で使用しているデータを使用。
同一のデータをそれぞれinnodb_file_par_tableをon/offした状態でimport。
参考までにデータの規模としては

  • テーブル数: 2232
  • DBのdumpサイズ(gzip圧縮): 4.1G

程度のもの。

検証内容

上記の検証環境に対して、

  • 通常の再起動
  • mysqld, mysqld_safeをkill -9した後に起動。

という操作をした時にかかる時間を計測した。

検証結果

ケース1: innodb_file_par_table -> ON

  • DBのデータディレクトリ: 49GB
  • ibdata1: 844M
  • 通常再起動: 4秒ほどで再起動完了
2014-05-16 18:47:50 8515 [Note] /opt/MySQL-server-5.6.16/sbin/mysqld: Normal shutdown
2014-05-16 18:47:54 2216 [Note] /opt/MySQL-server-5.6.16/sbin/mysqld: ready for connections.
  • mysqld, mysqld_safeをkill -9: 13秒ほどで起動完了。
140516 14:10:51 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql10
2014-05-16 14:10:52 8515 [Note] InnoDB: Starting crash recovery.
2014-05-16 14:10:52 8515 [Note] InnoDB: Reading tablespace information from the .ibd files...
2014-05-16 14:11:04 8515 [Note] InnoDB: Restoring possible half-written data pages 
2014-05-16 14:11:05 8515 [Note] /opt/MySQL-server-5.6.16/sbin/mysqld: ready for connections.

ケース2: innodb_file_par_table -> OFF

  • DBのデータディレクトリ: 38MB
  • ibdata1: 42GB
  • 通常再起動: 4秒ほどで再起動完了
2014-05-16 18:46:32 28222 [Note] /opt/MySQL-server-5.6.16/sbin/mysqld: Normal shutdown
2014-05-16 18:46:36 19375 [Note] /opt/MySQL-server-5.6.16/sbin/mysqld: ready for connections.
  • mysqld, mysqld_safeをkill -9: 5秒ほどで起動完了。
140516 14:14:48 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql11
2014-05-16 14:14:49 28222 [Note] InnoDB: Starting crash recovery.
2014-05-16 14:14:49 28222 [Note] InnoDB: Reading tablespace information from the .ibd files...
2014-05-16 14:14:50 28222 [Note] InnoDB: Restoring possible half-written data pages
2014-05-16 14:14:53 28222 [Note] /opt/MySQL-server-5.6.16/sbin/mysqld: ready for connections.

結果はこんな感じ。

以下の参考資料によると、innodb_file_per_tableだと、
大量のテーブルがあるDBのcrash recoveryプロセスでは、
idbファイルを読み込むのに時間がかかるとの事だったが、この検証ではそれほど気にならない時間で完了している模様。
(尚、RDSのドキュメントによるとテーブル数1000以上ではinnodb_file_per_tableはoffを推奨。)