BizStationブログ

ビズステーション株式会社の公式ブログです。

PDOより高速なORMライブラリ! Transactd PHP ORM リリース

2016年12月22日にTransactd PHP ORMをリリースしました。
これはTransactdを使用したMySQL/MariaDB用のORMライブラリです。

今回はこのTransactd PHP ORMを紹介します。

Contents

主な特徴

高速なDBアクセス

Transactd PHP ORMは、ORMでありながらPDOを直接使用したアクセスよりも高速なデータアクセスができます。
下図は、TransactdとPDO、Laravel EloquentORMで、findメソッドによる1レコードアクセスを(異なるidで)100回行ったときの時間を計測した結果です。PDOはSELECT * FROM table WHERE id=xで計測しています。

f:id:bizstation:20170111094719p:plain

TransactdはPDOの約2倍、Laravelの5.3倍高速に処理しています。
(100回ループすることで、クラスのロード時間などの影響を小さくし、純粋なデータアクセスにかかる時間を求めました。)

通常、PHPのORMはPDOを使って実装されます。それらは必ずPDOネイティブより遅くなります。MySQLに対して、PDOより高速に動作するのはおそらくTransactd PHP ORMだけでしょう。

省メモリ

Transactd PHP ORMは、他のORMに比べて非常に少ないメモリで動作します。読み取ったモデルの数にもよりますが、1つのモデルでLaravel 5.3の1/5程度、多くのモデルでも1/2以下のメモリ使用量です。

下の表は、上記のテストの前後においてmemory_get_usage関数で使用メモリの増分を計測したものです。

Transactd PDO Laravel
メモリ増加量 (KB) 81 459 442

スループット

高速なDBアクセスと省メモリによって、高いスループットが実現できます。Webリクエストに対するスループットは、処理全体に対するデータ処理の比率によって変わりますが、比較的データ処理が重いケースでは、Laravel 5.3に比べて2倍以上のスループットを実現しています。

下図は、Apache JMeterを使ってLaravelフレームワーク上にEloquentORMとTransactd PHP ORMで同じ内容のモデルを動作させ、処理時間を計測した結果です。
計測ページは2つのリレーションを持った200個のモデルをテーブル形式にしたHTMLを返しています。
f:id:bizstation:20170111115318p:plain
現実的なレスポンス時間を約300msec以下とすると、スループットはLaravelで秒間20クライアント、Transactdでは40クライントで、約2倍になっています。
同じLaravelのフレームワーク上なので、異なるのはORMのみです。ORMを変えることでWeb全体のスループットを向上できることがわかります。

高可用性

デフォルトで、マスター・スレーブ構成で、読み取りをスレーブ、書き込みをマスターに振り分ける機能があります。また、THAによる高可用運用が可能です。

自在なトランザクションとロック、スナップショット

Transactdには、1レコードずつインデックス順に自在にアクセスできるサーバーカーソルがあります。サーバーカーソルを使うと細かな行ロックとトランザクションの制御が可能です。

また、一貫性読取のためのスナップショットも簡単に行えます。
ミッションクリティカルなアプリケーションにも最適です。ロックとトランザクションについては、MySQL/MariaDBとTransactdのInnoDBロック制御詳細 その1 - BizStationブログを参照してください。

詳細なドキュメント

ドキュメントもライブラリの一部です。とにかく分かりやすくなるよう努力しました。

特に販売管理のサンプルアプリケーションでは、実際に動作するアプリケーションを作成しながら、ミッションクリティカルなポイントに重点を置いて説明しています。ORMを使わなくても、MySQLを使用している方には参考になる点があるかと思います。

欠点

欠点は、現在のところマイグレーションがサポートされていないことです。ただ、データベースがMySQLなので、フレームワークマイグレーションがあればそれをそのまま使用可能です。

詳細

すでにORMを使用されている方向けに、ORMの一般的な問題についてのTransactdでの対応内容を説明します。

ORMインターフェース

ORMのAPIインタフェースは、Ruby on Railsの流れを汲んだLaravel 5に非常に近いものです。TransactdのネイティブAPIとORMは非常に相性が良く、少ないコードでORMを構成しています。モデルの生成はC++で実装されたエクステンション内で行われ、非常に高速に処理されます。

リレーションのロードタイミング

Transactd PHP ORMのリレーションはデフォルトで、アクセス時にロードする遅延ロードです。また、モデルのコレクションのリレーションを一括して取得するEager loadingもサポートしています。
参考:モデル - パフォーマンス

インピーダンスミスマッチ

テーブルとモデルで扱う領域が異なることを、インピーダンスミスマッチと呼びます。Transactdでは、テーブルのフィールドごとに、別のクラスのプロパティへのマッピングを指定することで、ORMに値の読み書きをさせることが可能です。
参考:モデル - インピーダンスミスマッチ

モデルのキャッシュ

findメソッドを使用したユニークなキー値検索は頻繁に発生します。また、その値はあまり変化しない場合が多く、その都度データベースにアクセスするのは無駄が多くなります。そこでTransactd PHP ORMでは、そのようなモデルをキャッシュし、検索時にはキャッシュがあればそれを返します。
キャッシュの効果は非常に大きく、数十倍の速度アップになることもあります。
参考:モデル-キャッシュ

IDEのコード補完支援

モデルのプロパティは、モデル内に明示的に宣言する必要がありません。記述が簡単な反面、開発用のIDEからはどのような属性があるのかわからなくなります。
Transactd PHP ORMでは、モデルのソースコードジェネレータがPHPDocに対応した@propertyコメントを出力します。これによりIDEでのコード補完が可能になります。
参考:モデル-自動生成

プロパティアクセス速度

PHPでは、プロパティの実装でマジックメソッドを使うことができます。しかし、この方法は非常に低速です。Transactd PHP ORMは通常のプロパティの実装にマジックメソッドを使用しません。データベースアクセスの高速化だけでなく、プロパティアクセス速度にもフォーカスし、全体での処理速度の向上を図っています。

下の表は、取得済みのモデル200個について、プロパティの読取と設定を各モデル10回ずつ行ったときの時間を計測したものです。

Transactd Laravel 5.3 倍率
0.0002528 0.018078 71.5

TransactdはLaravel 5.3の70倍も高速にプロパティへの読み書きができます。

複雑なデータベース処理

ORMを使う/使わないの判断をする際に、複雑な処理になるとORMだけでデータベースアクセスを完結しにくいという問題があります。TransactdはORMとネイティブAPIの境目がありません。ORMを生かしながら自然にネイティブAPIを利用した複雑な処理にも対応できます。

まとめ

Transactd PHP ORMは、高速レスポンス、省メモリ、高スループットでミッションクリティカルな開発に適したORMです。
以下のようなORMを探している方に最適です。

  • MySQLへのアクセスのあるWebページのレスポンスを良くしたい
  • MySQLへのアクセスのあるWebサイトのスループットを良くしたい(垂直スケールアップしたい)
  • MySQLアクセスをマスターとスレーブに簡単に分散したい
  • 現在使用しているORMでレコードのロックや排他制御に不安がある
  • モデルのプロパティへのアクセスが遅いと感じている

Transactdは、ミッションクリティカルで高速なレスポンスと高いスループットを求めるアプリケーションに最適です。小さな規模から大きなものまで対応できます。
ORMのインタフェースはLaravel 5に近いので、分かりやすく学習コストも少なくてすみます。
インストールはComposerで簡単に行えます。Packagist transactd/ormをご覧ください。

是非、サクサクで堅牢なTransactd PHP ORMを体感してみてください。