InnoDB のパフォーマンスチューニング - MySQLカンファレンス2007
- http://www.mysql-ucj2007.jp/details/j25.html
- 木下 靖文 氏
NTTコムウェア株式会社 プロジェクト管理統括部技術SE部門 DB技術グループ
(「InnoDB」は「いんのでーびー」と言うらしい...今まで「いのでーびー」と言ってました)
InnoDBチューニングの王道的アプローチ
- クエリを改善して全体的に処理効率を上げる
- データサイズをできるだけ小さく
- メモリをできるだけ多く積む
コミット性能(同期書き込み)
- innodb_flush_log_at_trx_commit=1,0,2
- 0 1秒ごと
- デフォルト:1 コミットのたびに同期書き込み
- 2 1秒またコミットのたび
- マスターは1を推奨
同期書き込みのパフォーマンス
- fsync() (あるいはO_SYNC + write, fdatasync()) の速度に依存
- ディスクに対する同期書き込み1回の所要時間
- シーク待ち時間 4ms
- 回転待ち 4ms
- 転送時間 1ms
- 合計 9ms
同期書き込みのパフォーマンス向上
よくある問題
- 主キーは重複しないようにUUIDにした
- とりあえずインデックスつけた
- ...
クラスタインデックスと主キー
クラスタインデックスの特性を生かす
AUTO_INCREMENTとスケーラビリティ
巨大な列の扱いには注意
- InnoDB Buffer Poolには全ての列が読み込まれる
- ので、Text型は分けたほうがよいときがある
データ型と文字エンコーディング
innodb_buffer_pool_size
チェックポイントに影響のあるパラメータ
Next-Key Locking
- InnoDBログファイルとバイナリログの不整合を防ぐために必要な実装
Next-Key Lockingの無効か
その他のパラメータ
- innodb_thread_concurrency
- innodb_support_xa
- バイナリログとInnoDBログファイルの同期をとる(2相コミット)
- 5.0から
- デフォルトON
- innodb_autextend_increment
- 単位時間あたりのデータほげほげ
- デフォルト8MB すくない
- innodb_file_per_table
- テーブルごとにファイルを作成
- デフォルトoff
- table_cache
- 同時実効性をあげるための重要なパラメータ
- 目安は 同時接続数 x テーブル数
- 1024〜2048が一般的
- thread_cache
- 切断した後に、再接続を軽いコストでできるようにするためのキャッシュ
- コネクションプールを使わない場合に効果的
- 数百程度にすることも珍しくない
5.1での変更内容
- AUTO_INCREMENTの同時実効性の向上
- 透過的なテーブルの圧縮(オプション)
- row_format=COMPRESSED engine=InnoDB
- CPU使用率が若干増加す
- インデックスの追加/削除が高速になる
- 5.0までは1行1行処理してた
- 5.1からはインデックス領域だけの再作成ができるようになった
- 6.0ではオンラインで再作成の予定
- Next Key Lockignの無効か
- ...
シャットダウン時間の短縮
ALTER TABLE, LOAD DATAの高速化
- SET GLOBAL ...trx_commit=0
- 処理
- 1