はじめに
Cloud SQL(SQL)とBigtable(NoSQL)のコード記述および処理スピードを比較は以下の条件で行っています。
コード記述
Java言語からのアクセスで、Cloud SQLではMySQLの動的SQLを使用し、BigtableではLow-Level APIを使用しています。Bigtableアクセス用のAPIとしてはこの他に、日本発のオープンソースフレームワークのSlim3やJDO(Java Data Objects)、JPA(Java Persistence API)などもありますが、アクセスパフォーマンスでは、ここで使用するLow-Level APIか最も優れているはずです。
処理スピード比較
処理スピードの比較は、アイテムマスタのCRUD処理(登録・参照・更新・削除)をそれぞれ同じ画面内容からのアクセスで、Bigtableはクラウド環境で、Cloud SQLではクラウドとローカルの両方で測定を行っています。処理時間の測定では該当のメソッドが呼び出された瞬間から登録などの処理完了直後までの時間を、それぞれの処理パターンで計5回連続して測定しています。
対象ユーザ
- Google App Engine for Javaに興味がある方
- クラウドでのRDB(リレーショナルデータベース)使用に興味のある方
必要な環境
Eclipse 3.5(Galileo)、3.6 (Helios)、3.7 (Indigo)のいずれか。
テストシステムの構成と画面
今回のパフォーマンス比較は図1のシステム構成で行われています。図1では、ブラウザからの入力データをjQueryの非同期通信でサーブレットに送信し、サーブレットは受信データから処理モードを判断して対応するビーンズメソッドを呼びだします。
ビーンズには、この記事で使用されているCloud SQLおよびBigtable用のすべての処理ルーチンがメソッドとして用意されており、リクエストに応じてMySQLまたはBigtableにアクセスし、要した処理時間を返すようになっています。
現在のGAEでは、新たに作成したアプリケーションのデータストアは、デフォルトでHRD(High Replication Datastore)が使用されます。HRDはSDK 1.4.1からサポートされており、従来のMaster/Slaveデータストアに比べてデータの読み込み・書き込みでの可用性が高くなっていますが、書き込みに要する時間はやや遅くなります。
ローカル環境でのインスタンス選択
今回のパフォーマンステストでは、Eclipseを使用したローカル環境での実行速度も測定しています。
- ローカル環境でCloud SQLを実行する場合は、MySQLサーバをEclipseの外で起動しておく必要がありますが、筆者の場合は、フリーソフトのXAMPPを使用しています。
- ローカル環境ではMySQLインスタンスとGoogle Cloud SQLインスタンスのどちらかを選択して実行しますが、MySQLインスタンスを選択した場合の方が遥かにパフォーマンスの良い処理速度が測定されています。
ただし、MySQLインスタンスではローカル環境のMySQLにアクセスするのに対して、Google Cloud SQLインスタンスではローカル環境でもGAEクラウド上のMySQLをアクセスしています。従ってネットワークレイテンシがかなり異なっており、パフォーマンスの差異にかなり影響しているはずです。
インスタンスの選択は次のような手順で行います。
- EclipseのProject Explorerから対象となるプロジェクトを右クリックしてリストを表示し、最下部にあるPropertiesを選択してProperties画面を表示します(「Alt+Enter」でも表示可能)。
- 表示されるProperties画面からGoogle -> App Engineと選択すると図2のような表示に変わるので、この画面下部の「Google Cloud SQL」でインスタンスの設定を行います。
- Google Cloud SQLで 「Enable Google Cloud SQL」をチェック。これはCloud SQL使用している場合はチェックしているはずです。ここで右の「My Instances..」をクリックすると、前回紹介したクラウド上のCloud SQLを管理する「Google APIs Console」画面が表示されます。
- 次に、開発環境でのSQLインスタンスを選択しますが、これはMySQLインスタンスおよびGoogle Cloud SQLインスタンスのどちらも使用することができます。