本連載では、3回にわたってチューニングの要であるオプティマイザについて説明してきた。オプティマイザは論理的な表現であるクエリを物理的にどう処理するかということを決めるRDBMSの心臓部であると言える。しかしながら、人体が心臓だけで機能しないのと同じように、RDBMSもオプティマイザだけで成り立つわけではない。実際に手足となりデータを操作するのはストレージエンジンだ。今回は、MySQLの代表的な(実質的にはデファクトスタンダードの)ストレージエンジンであるInnoDBの基本的なチューニングについて解説しようと思う。クエリのチューニングとは全くストラテジーが異なるので、これまで連載を読んで頂いている方は、ここで頭を切り替えて欲しい。
InnoDBを使おう!
もし本稿を読まれている方で、特に明確な意味もなくまだMyISAMストレージエンジンを使ってらっしゃるという方には、全力でInnoDBをオススメしたい。InnoDBには、MyISAMにはない様々な利点があるからだ。
トランザクション対応
InnoDBはACID準拠のトランザクションに対応している。トランザクションの利点は改めて語るまでもないが、DBAの負担を減らしてくれることは間違いない。トランザクションに対応していないストレージエンジンは、集計用の一時的な領域などには良いかも知れないが、文字通りトランザクションを処理するには無理がある。原子性がないということは、処理が失敗したらたちまちデータに不整合が生じるということだし、永続性がないということはOSやマシンのクラッシュ時にはデータが破損する可能性があるということだ。やってできなくはないが、わざわざリスクを抱えてデータベースを運用することはないだろう。(MyISAMと比べて、InnoDBを用いるとデッドロックなどでトランザクションが失敗したときのエラー処理を記述する必要が出てくる。MyISAMではエラー処理を記述しないで利用できるので一見すると楽に思えるが、実際には単に開発の負担を運用に押し付けているだけであるといえる。)
InnoDBでは、トランザクションにおいて次のような機能を利用可能だ。
- XAトランザクション
- セーブポイント
-
4つの分離レベル
- READ-UNCOMMITTED
- READ-COMMITTED
- REPEATABLE-READ
- SERIALIZABLE
高い並列性
InnoDBはMyISAMと比べて処理の並列性が格段に高い。何故ならロックの粒度が、MyISAMではテーブル単位なのに対し、InnoDBでは行単位だからだ。しかも、MVCC(マルチ・バージョン・コンカレンシ・コントロール)により、更新と参照が競合することがない。同時実行されている他のトランザクションが行を更新した場合でも、その行への参照がブロックされることがない。
最近ではひとつのCPUパッケージに多数のCPUコアが搭載されるようになった。InnoDBでは、コア数の多いシステムでもCPUリソースを活用できるというわけだ。
外部キー制約
外部キー制約を用いれば、テーブルの更新処理の設計が格段に楽になる。その結果、開発の負担がかなり減るだろう。また、外部キーを使えば実行するべきクエリの回数が減るので、更新性能にも好影響が出る可能性がある。
デッドロック検出
InnoDBにはデッドロック検出機能があるのも大きな特徴だ。そのため、2つのトランザクションがロックを取り合った結果デッドロックを起こしてしまった場合、即座にひとつのトランザクションをロールバックすることができる。デッドロック検出機能がない場合、ロックの獲得にタイムアウトを設けてデッドロックを回避することになり、その場合にはタイムアウトまで待つことになるので時間のロスが大きいのだが、InnoDBではそのような時間のロスは発生しない。厳密には完全にデッドロックを検出することが出来るわけではないのでタイムアウトを待つケースもごく稀にあるのだが、ほとんどのケースではロック待ちに陥るトランザクションを救済できる。
大きなリソースを扱える
最近はメモリサイズの進歩にも著しいものがあり、数十GB~数百GBレベルのメモリを搭載したサーバーマシンも珍しくなくなってきた。InnoDBは、処理の並列性も高いが、メモリを有効活用するという点でも優れている。大きなデータを扱う場合には大きなバッファを割り当てて性能の向上をさせたいと思われるだろう。InnoDBならば可能だ。
圧縮
InnoDBはテーブル内のデータ圧縮にも対応している。当然圧縮・解凍を行う分CPU消費は上昇するが、データサイズを抑えたい場合、I/Oを減らしたい場合には有効だ。
オンラインバックアップ
バックアップはDBAにとって最大の課題のひとつだ。バックアップ中は負荷が増大になるし、MyISAMなどでは整合性のあるバックアップを採取するためにはバックアップ中は更新処理を停止しなければならない。InnoDBはmysqldumpでも--single-transactionオプションを使えばMVCC機能により、更新を妨げることなくバックアップを採取できる上、規模が大きくなればMySQL Enterprise Backupなどのツールを用いて高速にバックアップを取ることが可能だ。
この記事は参考になりましたか?
- MySQLチューニング虎の巻連載記事一覧
-
- MySQL InnoDBストレージエンジンのチューニング(後編)
- MySQL InnoDBストレージエンジンのチューニング(前編)
- MySQLチューニング虎の巻/ソートに関連するトピックとクエリの書き換え
- この記事の著者
-
奥野 幹也 (オクノ ミキヤ)
日本オラクル株式会社
MySQL Global Business Unitテクニカルアナリスト※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア