MySQLのinnodb_file_per_tableについての検証
背景
innodb_file_per_tableを有効にしている場合に、
テーブル数が多くなるとMySQLの起動/停止や、innodbのクラッシュリカバリに時間がかかるようになるとの噂を聞いたので、
その辺りを含めた簡単な検証をしてみたメモ。
あまりしっかりとした調査はしていないので参考程度に。
尚、innodb_file_per_tableについての説明は割愛。
検証環境
検証した環境は、
- OS: Scientific Linux release 6.1
- MySQL: MySQL-server-5.6.17
- FileSystem: ext4
実運用サービスの開発機で使用しているデータを使用。
同一のデータをそれぞれinnodb_file_par_tableをon/offした状態でimport。
参考までにデータの規模としては
程度のもの。
検証内容
上記の検証環境に対して、
- 通常の再起動
- 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を推奨。)