CodeZine(コードジン)

特集ページ一覧

Google Cloud SQLとBigtableのコード記述と処理スピードを比較・検討してみる

Google App Engine for JavaでMySQLを使ってみる(2)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/04/13 10:30

目次

マスタ参照

 参照では、ローカルのCloud SQLインスタンス以外、Cloud SQLおよびBigtableの両方で初回の時間遅延が顕著でした。

Cloud SQL

リスト6 Cloud SQLでマスタ参照(revIteminfo)
    public String revltemInfo(String item_no){
        // Start Timer
        long start = System.currentTimeMillis();
        // Start Timer
        try{
            String sql = "select * from item_info where item_no = ?";  //(1)
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, item_no);
            ResultSet rs = ps.executeQuery();                          //(2)
            if(rs.next()) {    
                String item_name = rs.getString("item_name");
                String final_flag = rs.getString("final_flag");
                String vendor_no = rs.getString("vendor_no");
                String vendor_name = rs.getString("vendor_name");      //(3)
                // End Timer
                long stop = System.currentTimeMillis();    
                // End Timer
                long time = stop - start;    
                rv =  "{\"status\": \"" + "参照成功:  " + time + " ms" + "\",\"item_name\": \"" + item_name + "\", \"final_flag\": \"" + final_flag + "\", \"vendor_no\": \"" + vendor_no + "\", \"vendor_name\": \"" + vendor_name + "\"}";
            } else {
                rv =  "{\"status\": \"参照不成功\"}";
            }                
        }catch(SQLException e){
            rv =  "{\"status\": \"接続不成功\"}";
        }catch(Exception e){
            e.printStackTrace();
            rv = "参照失敗\n理由:" + e.toString();
        }finally{
            try{
                con.close();
            }catch(Exception e){}
        }        
        return rv;
    }

 参照処理では(1)のSQL文指定から、(2)のクエリー実行を経て(3)での検索データの取得終了までで測定を行っています。キー検索での参照データはJSONフォーマットでWebクライアントに送信していますが、参照処理自体は通常のJavaからのMySQLアクセスなので問題ないでしょう。

Bigtable

リスト7 Bigtableでマスタ参照(revIteminfo_kv)
    public String revltemInfo_kv(String item_no){
        // Start Timer
        long start = System.currentTimeMillis();
        // Start Timer
        try{
            Entity itemf = ds.get(KeyFactory.createKey("item_info", item_no));  //(1)
            String item_name = itemf.getProperty("item_name").toString();       //(2)
            String final_flag = itemf.getProperty("final_flag").toString(); 
            String vendor_no = itemf.getProperty("vendor_no").toString(); 
            String vendor_name = itemf.getProperty("vendor_name").toString();   //(3)
            // End Timer
            long stop = System.currentTimeMillis();    
            // End Timer
            long time = stop - start;    
            rv = "{\"status\": \"" + "参照成功:  " + time + " ms" + "\", \"item_name\": \"" + item_name + "\", \"final_flag\": \"" + final_flag + "\", \"vendor_no\": \"" + vendor_no + "\", \"vendor_name\": \"" + vendor_name + "\"}";
        }catch(EntityNotFoundException e){
                rv = "Error = " + e;
        }catch(Exception e){
                rv = "Error = " + e;
        }
        return rv;        
    }    

 Bigtableでは(1)のキー検索で対象となるエンティティを取得し、後は(2)以下のgetPropertyによってプロパティ値を取得します。Bigtableの検索ではSQLによる検索のように取得するプロパティ(フィールド)項目を指定することはなく、SQLで「*」を指定した場合のように必ずすべてのプロパティ項目が取得され、その中から必要な項目だけをgetPropertyで変数にセットする形式になります。

 Low-Level APIを使用した場合は(3)でプロパティ値の取得が完了するまでが参照処理で、リスト7でのSQLではこれと対応する形で時間測定を行っています。

参照処理時間の測定結果

表3 参照処理時間の測定結果(単位ミリ秒)
  1 2 3 4 5
Cloud SQL 参照(クラウド) 890 57 56 57 57
Cloud SQL 参照(ローカルCI) 280 275 282 275 273
Cloud SQL 参照(ローカルMI) 181 19 23 22 23
Bigtable1 参照(クラウド) 725 6 6 9 6
表4 参照処理時間平均(単位ミリ秒)
  全平均 1-4平均
Cloud SQL 参照(クラウド) 223.40 56.75
Cloud SQL 参照(ローカルCI) 277.00 275.75
Cloud SQL 参照(ローカルMI) 53.60 21.75
Bigtable1 参照(クラウド) 150.40 6.75

 参照処理では、Cloud SQLおよびBigtableの両方で、初回検索の検索遅延が大きくなっています。これはかなり時間を置いて検索を行った場合で、例えば実際の業務アプリなどである程度頻繁に使用する場合はあまり問題はないかもしれません。Bigtableでは2回目以降はすべて10ミリ秒以内で検索が終了していますが、これは初回検索で同じkindに属するエンティティがメモリ上にキャッシュされ、2回目以降はキャッシュデータからの読み取りになっていると推測されます。

グラフ2 Cloud SQLとBigtableの参照処理時間(Y軸ミリ秒)
グラフ2 Cloud SQLとBigtableの参照処理時間(Y軸ミリ秒)

 グラフ表示にすると、初回検索の突出した所要時間がよりクリアに見て取れます。参照の場合もアクセスパフォーマンスの順番は同じで、最も高速なのがクラウド上のBigtableで、次にローカルMySQLインスタンスのCloud SQL、クラウド上のCloud SQLと続いています。ローカルでのCloud SQLインスタンスを使用した場合はネットワークレイテンシもあり遅くなっています。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Google App Engine for JavaでMySQLを使ってみる

著者プロフィール

  • 清野 克行(セイノ カツユキ)

    慶應義塾大学工学部電子物理専攻卒。日本IBM、日本HPで、製造装置業を中心とした業務系/基幹業務系システムのSE/マーケティングや、分散アプリケーションによる社内業務システム開発などに携わる。現在は、クラウドやAjax関連の/ソフト開発/書籍執筆/セミナー講師/コンサルティング、などを行っている。情...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5