【コラム】

FileMaker×PHPで作る、簡単・便利なWebアプリ

18 スピードアップのために徹底チューニング(1) フィールドの配置法

18/116

スピードアップのための徹底チューニング

これまで何回か紹介してきたとおり、FileMakerをデータベースとしたWebアプリは、なにも考えずに実装してしまうとパフォーマンスが出にくい。ほかのデータベースでは一瞬で終わるような検索でも、FileMakerなら数秒~数分も待たされることがままある。

FileMakerでは「テーブルオカレンス」「自己リレーション」「計算フィールド」「集計フィールド」「スクリプト」といった、やや独自色の強い考え方がいくつもある。FileMaker Proでは「惰性で何気なく使っていた」実装方法も、Webアプリケーション上で場面を考えずに安易にこれらのテクニックを使用してしまうといつの間にかボトルネックになっていたということもある。しかし、これら「やっていい事」「やってはいけない事」を区別して場面ごとに適切な実装をおこなえばFileMakerのメリットを最大限発揮できるWebアプリケーションを実装することが可能となるのだ。

これまでに取りあげてきた内容と比較すると突っ込んだ話になるが、なるべく「簡単に」「どんな場面でも適用しやすい」「すでに実装したWebアプリにも適用可能」な範囲内でいくつかのノウハウを紹介していこう。

スピードアップのための、フィールド配置法

スピードアップのための徹底チューニング、第1回目は「フィールドの配置法」を取りあげよう。ここでのフィールド配置は、PHP側でのユーザインタフェースではなく、FileMakerのレイアウトに配置するフィールドのことを指す。

XMLでのカスタムWeb公開とFX.phpを使用したFileMaker Webアプリでは、FileMakerサーバとPHPの間でXMLデータを使用して通信をおこなっている。XMLデータはFX.phpから発行される各種クエリコマンドとパラメータによって形式が変化する。そして重要なポイントとして、XMLデータには処理中最後に表示していたレイアウトに表示されたレコードと、配置されているフィールドの内容が含まれる。

XMLデータにはフィールドの名称やFileMakerで設定した入力値の制限といったオプション、対象レコードの内容が「レイアウトに配置されているフィールド分」だけ格納される。このXMLデータのサイズを極力小さなサイズにできるように心がければ、スピードアップが期待できる。一番効果を発揮できるのは「一覧画面」といった、すべてのフィールドを表示する必要がない場面だ。実際に必要なデータだけをやり取りすることで、どれだけの改善がはかれるかを試してみよう。使用したFileMakerファイルの情報は次のとおり。

テーブル「fm_tune」。シリアル・登録日時・更新日時のほかに「テキスト」「数値」「日付」タイプのフィールドをそれぞれ10個作成している

レイアウト「fm_tune」。テーブル内のフィールド33すべて配置している。それぞれのフィールドには「フィールド名」「Random関数の実行結果」「2009/6/22」を格納した

レイアウト「fm_tune_list」。タイプがことなるフィールドより2つずつを配置し、計9フィールドが配置されている。

場面ごとにレイアウトを切りかえることでどれだけのスピードアップが望めるかを確認してみよう。ここでは確認にあたり、Apache Bench(ab)を使用して計測をした。requestsは100、concurrencyは3にセットしている。

レイアウト「fm_tune」へのアクセス結果

% ab -n 100 -c 3 -A admin:admin "http://localhost/fmi/xml/FMPXMLRESULT.xml?-db=fm_tune.fp7&-lay=fm_tune&-max=30&-find"

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        Apache/2.2.9
Server Hostname:        localhost
Server Port:            80

Document Path:          /fmi/xml/FMPXMLRESULT.xml?-db=fm_tune.fp7&-lay=fm_tune&-max=30&-find
Document Length:        42057 bytes

Concurrency Level:      3
Time taken for tests:   6.254 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      4244200 bytes
HTML transferred:       4205700 bytes
Requests per second:    15.99 [#/sec] (mean)
Time per request:       187.621 [ms] (mean)
Time per request:       62.540 [ms] (mean, across all concurrent requests)
Transfer rate:          662.73 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       3
Processing:    98  186  40.2    190     297
Waiting:       37   80  28.2     75     161
Total:         98  186  40.2    190     297

Percentage of the requests served within a certain time (ms)
  50%    190
  66%    202
  75%    208
  80%    214
  90%    235
  95%    258
  98%    290
  99%    297
 100%    297 (longest request)

レイアウト「fm_tune_list」へのアクセス結果

% ab -n 100 -c 3 -A admin:admin "http://localhost/fmi/xml/FMPXMLRESULT.xml?-db=fm_tune.fp7&-lay=fm_tune_list&-max=30&-find"

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        Apache/2.2.9
Server Hostname:        localhost
Server Port:            80

Document Path:          /fmi/xml/FMPXMLRESULT.xml?-db=fm_tune.fp7&-lay=fm_tune_list&-max=30&-find
Document Length:        12524 bytes

Concurrency Level:      3
Time taken for tests:   3.208 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1290900 bytes
HTML transferred:       1252400 bytes
Requests per second:    31.17 [#/sec] (mean)
Time per request:       96.233 [ms] (mean)
Time per request:       32.078 [ms] (mean, across all concurrent requests)
Transfer rate:          393.00 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       2
Processing:    52   96  23.6     93     165
Waiting:       42   80  22.8     77     144
Total:         52   96  23.6     93     166

Percentage of the requests served within a certain time (ms)
  50%     93
  66%    105
  75%    111
  80%    114
  90%    132
  95%    140
  98%    153
  99%    166
 100%    166 (longest request)

localhostへのアクセスなので正確な結果ではないものの、これらの結果からおおよそ2倍ほどのスピードアップが望めることが確認できた。とくに意識していないと一覧画面も詳細画面もデータ保存に使用するレイアウトも一緒くたにしてしまいがちだが、レイアウトに配置するフィールドを整理するだけでも、これだけの差が出る。レイアウトの管理が若干面倒になるが、得られるスピードを考えると管理の手間を差し引いても充分なおつりがくるだろう。肥大化したシステムでは必須のテクニックと言える。

フィールドの配置について、注目するポイントは次のとおり。

  • 必要のないフィールドは配置しない(とくに非保存の計算フィールドや集計フィールド)
  • 必要のないポータルは配置しない。どうしても必要な場合は、専用のリレーションを組み必要最低限のレコードしか取得しないように構成する

非保存の計算フィールドや集計フィールドを使うことでのスピード低下は追って紹介していこう。なお、FX.phpの場合はSetDBDataの第4引数にこの「レスポンスレイアウト(-lay.response)」が指定できるようになっている。すでにFX.phpを使用したWebアプリがある場合は、該当箇所の第4引数に整理したレイアウトを指定するだけでスピードが違ってくるはずだ。必要なときに必要なだけの情報を取り扱うように心がけ、少しでもスピードアップできるように実装していこう。

18/116

インデックス

連載目次
第116回 最新の情報を追い続ける
第115回 簡易エラーロギングで、トラブルシューティングをより素早く(2)
第114回 簡易エラーロギングで、トラブルシューティングをより素早く(1)
第113回 表示方法「表形式」の落とし穴
第112回 FileMaker Webアプリで見落としやすいセキュリティのポイント
第111回 外部データソースに注意! Web公開が遅くなったときのチェック
第110回 FX_Fuzzy_Debuggerで補足できるエラー
第109回 FileMakerデバッグの際に有用なツールを自作する
第108回 繰り返しフィールドを扱うときの注意点
第107回 FX.phpのデバッグメッセージをコンソールに表示する
第106回 FileMaker Serverの「使用状況」とは
第105回 Web経由でのCSVエクスポート
第104回 Web公開でのグラフ表示にチャレンジ
第103回 データベースデザインレポートを活用したWeb帳票(4)
第102回 データベースデザインレポートを活用したWeb帳票(3)
第101回 データベースデザインレポートを活用したWeb帳票(2)
第100回 データベースデザインレポートを活用したWeb帳票(1)
第99回 SetLogicalOR()と空白・改行文字の取扱いについて
第98回 FMCakeMixでスクリプトを二重起動させない方法
第97回 コマンドラインを活用したメンテナンス方法(3)
第96回 コマンドラインを活用したメンテナンス方法(2)
第95回 コマンドラインを活用したメンテナンス方法
第94回 FMFind()とFMView()の処理の違いとは
第93回 オブジェクトフィールドからファイル参照への移行法
第92回 FX.phpで複合検索をおこなうには(3)
第91回 FX.phpで複合検索をおこなうには(2)
第90回 FX.phpで複合検索をおこなうには(1)
第89回 Hello, FMCakeMix! チュートリアル(14)
第88回 Hello, FMCakeMix! チュートリアル(13)
第87回 Hello, FMCakeMix! チュートリアル(12)
第86回 Hello, FMCakeMix! チュートリアル(11)
第85回 Hello, FMCakeMix! チュートリアル(10)
第84回 Hello, FMCakeMix! チュートリアル(9)
第83回 Hello, FMCakeMix! チュートリアル(8)
第82回 Hello, FMCakeMix! チュートリアル(7)
第81回 Hello, FMCakeMix! チュートリアル(6)
第80回 Hello, FMCakeMix! チュートリアル(5)
第79回 Hello, FMCakeMix! チュートリアル(4)
第78回 Hello, FMCakeMix! チュートリアル(3)
第77回 Hello, FMCakeMix! チュートリアル(2)
第76回 Hello, FMCakeMix! チュートリアル(1)
第75回 最新FMCakeMixの動向を追う(3)
第74回 最新FMCakeMixの動向を追う(2)
第73回 最新FMCakeMixの動向を追う
第72回 FileMaker Webアプリを支えるライブラリ集
第71回 メンテ必須事項! 長期運用でのポイント(4)
第70回 メンテ必須事項! 長期運用でのポイント(3)
第69回 メンテ必須事項! 長期運用でのポイント(2)
第68回 メンテ必須事項! 長期運用でのポイント(1)
第67回 FileMaker Server 10→11での変更点
第66回 FX.php/APIの違い - スクリプトの実行
第65回 FX.php/APIの違い - レコード削除
第64回 FX.php/APIの違い - レコード編集(2)
第63回 FX.php/APIの違い - レコード編集(1)
第62回 FX.php/APIの違い - レコード検索(7)
第61回 FX.php/APIの違い - レコード検索(6)
第60回 FX.php/APIの違い - レコード検索(5)
第59回 FX.php/APIの違い - レコード検索(4)
第58回 FX.php/APIの違い - レコード検索(3)
第57回 FX.php/APIの違い - レコード検索(2)
第56回 FX.php/APIの違い - レコード検索(1)
第55回 FX.php/APIの違い - レコード登録(2)
第54回 FX.php/APIの違い - レコード登録(1)
第53回 番外編: CakePHPでFileMakerを使う方法
第52回 レコードの取扱いに特化したクラス"FileMaker_Record" (3)
第51回 レコードの取扱いに特化したクラス"FileMaker_Record" (2)
第50回 レコードの取扱いに特化したクラス"FileMaker_Record" (1)
第49回 結果セットの取扱いに特化したクラス、FileMaker_ResultSet(2)
第48回 結果セットの取扱いに特化したクラス、FileMaker_ResultSet(1)
第47回 ポータル情報の取得に特化したクラス、FileMaker_Field
第46回 フィールド情報の取得に特化したクラス、FileMaker_Field(4)
第45回 フィールド情報の取得に特化したクラス、FileMaker_Field(3)
第44回 フィールド情報の取得に特化したクラス、FileMaker_Field(2)
第43回 フィールド情報の取得に特化したクラス、FileMaker_Field(1)
第42回 レイアウト情報取得に特化したFileMaker_Layout(3)
第41回 レイアウト情報取得に特化したFileMaker_Layout(2)
第40回 レイアウト情報取得に特化したFileMaker_Layout(1)
第39回 API for PHPの中枢、FileMakerクラス(3)
第38回 API for PHPの中枢、FileMakerクラス(2)
第37回 API for PHPの中枢、FileMakerクラス(1)
第36回 API for PHPでのオブジェクトフィールド取り扱い
第35回 API for PHPでのレコード複製・削除方法、関連メソッド紹介
第34回 API for PHPでのレコード編集方法、関連メソッド紹介(2)
第33回 API for PHPでのレコード編集方法、関連メソッド紹介(1)
第32回 API for PHPでのレコード検索、関連メソッド紹介(2)
第31回 API for PHPでのレコード検索、関連メソッド紹介(1)
第30回 API for PHPを使うなら覚えておきたいvalidateの使い方
第29回 API for PHPでのレコード登録方法、関連するメソッドの紹介(2)
第28回 API for PHPでのレコード登録方法、関連するメソッドの紹介(1)
第27回 API for PHPでのDB接続手順、レコード表示まで(2)
第26回 API for PHPでのDB接続手順、レコード表示まで(1)
第25回 2大ライブラリのもうひとつ、API for PHPを試す
第24回 スピードアップのための徹底チューニング(6) 総集編
第23回 スピードアップのための徹底チューニング(6) スクリプトを活用せよ
第22回 スピードアップのための徹底チューニング(5) 続・集計には中間テーブル
第21回 スピードアップのための徹底チューニング(4) 集計には中間テーブル
第20回 スピードアップのための徹底チューニング(3) 集計フィールドは置かない
第19回 スピードアップのための徹底チューニング(2) 検索実装の御法度
第18回 スピードアップのために徹底チューニング(1) フィールドの配置法
第17回 見落としがちな「アカウントとアクセス権」の管理術
第16回 「CSVからデータをインポートしたい」には要注意!(2) - 実装編
第15回 「CSVからデータをインポートしたい」には要注意!(1) - まずは解説から
第14回 エラーコード早見表 & お手軽デバッグ「Fuzzy_Debugger」
第13回 値一覧でユーザビリティアップ! JavaSciptを活用せよ
第12回 オブジェクトフィールドから脱却! よりよいパフォーマンスを出す実装とは
第11回 オブジェクトフィールドは鬼門?! Webから取り扱うときの注意点
第10回 PHPデプロイ/FMサーバ管理者必見、カスタマイズすべき設定
第9回 PHPのインストール~FileMakerデプロイ
第8回 FileMaker Webアプリのインストール
第7回 FileMakerといえば帳票! さくっとデザインしてWebからPDFダウンロード
第6回 FileMakerならではのメリットを出すには - スクリプトを活用せよ
第5回 基礎編はこれで終わり! - 詳細/変更/削除処理
第4回 いよいよUIの実装へ! 最初は登録/一覧画面
第3回 FileMakerのCRUDはこれで完璧! - FMEdit()~FMDelete()まで
第2回 レコードの登録 - 各種関数・メソッドの紹介
第1回 まずは2大ライブラリを比較

もっと見る



転職ノウハウ

あなたが本領発揮できる仕事を診断
あなたの仕事適性診断

シゴト性格・弱点が20の質問でサクッと分かる!

「仕事辞めたい……」その理由は?
「仕事辞めたい……」その理由は?

71%の人が仕事を辞めたいと思った経験あり。その理由と対処法は?

3年後の年収どうなる? 年収予報
3年後の年収どうなる? 年収予報

今の年収は適正? 3年後は? あなたの年収をデータに基づき予報します。

激務な職場を辞めたいが、美女が邪魔して辞められない
激務な職場を辞めたいが、美女が邪魔して辞められない

美人上司と可愛い過ぎる後輩に挟まれるエンジニアの悩み

人気記事

一覧

イチオシ記事

新着記事

求人情報