FX.php/APIの違い - レコード検索(2), (3)で作成した2つの検索/一覧PHPを使用し、動作のパフォーマンス・サーバにかかる負荷を比較する。検索パフォーマンス比較の最後は、レコード総数を500,000件に増やした環境下で結果を検証する。
今回比較した環境について
これまでの検証結果から「ソート」や「計算・集計フィールド」、「配置するフィールド」の使い方に注意することで、総レコードが50件でも5,000件でもそこまでパフォーマンス差は表れないことがわかった。
FileMakerはレコード数が多いとパフォーマンスが落ちやすいとよく言われる。FileMaker Serverで公開されているファイルをFileMaker Proでネットワーク越しにアクセスした場合、とくにリスト形式や表形式のレイアウトを表示すると画面描画がもたつく印象がある。Web公開の機能も総レコード数が多いと影響を受けるのか。そこで今回は、総レコード数を5,000件から500,000件に増やした状態でテストをおこなってみた。
FileMakerファイル環境 - I~M共通
- 総レコード数: 500,000件
- レスポンスレイアウトに配置しているフィールド数: 9
- 計算・集計フィールドの有無: なし
- ソート指定の有無: なし
FileMakerファイル環境 - I
FileMakerファイル環境 - J
FileMakerファイル環境 - K
FileMakerファイル環境 - L
FileMakerファイル環境 - M
レコード総数を5,000件から500,000件に拡大。レコード取得数($max)は前回同様、10件ずつ増やしていく。クライアントPCからApache JMeterを使用し、(2), (3)で作成したfx_find.phpとapi_find.phpにアクセス、応答速度などを計測する。
- 同時使用ユーザ数(スレッド数); 10, 20, 30, 40, 50
- リクエスト回数: 1回
- ループ数: 100
クライアントPCパフォーマンス - fx_find.php - 環境I
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1,000 |
463 |
82 |
7064 |
360.92 |
20.4 |
82.22 |
00:48.80 |
20 |
2,000 |
1079 |
67 |
20770 |
2237.07 |
17.4 |
70.1 |
01:54.98 |
30 |
3,000 |
1315 |
69 |
19973 |
1451.79 |
21.2 |
85.67 |
02:21.13 |
40 |
4,000 |
1828 |
67 |
33214 |
2383.13 |
20.3 |
81.72 |
03:17.22 |
50 |
5,000 |
2127 |
67 |
47040 |
4312.42 |
20.3 |
81.99 |
04:05.83 |
|
平均 |
1362.4 |
70.4 |
25612.2 |
2149.07 |
19.92 |
80.34 |
|
クライアントPCパフォーマンス - fx_find.php - 環境J
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1,000 |
609 |
96 |
1560 |
111.43 |
16 |
97.23 |
01:02.37 |
20 |
2,000 |
1343 |
94 |
20009 |
2224.32 |
14 |
85.06 |
02:22.72 |
30 |
3,000 |
1806 |
111 |
16994 |
1326.4 |
15.9 |
96.66 |
03:08.41 |
40 |
4,000 |
2478 |
95 |
35758 |
2562.08 |
15 |
91.36 |
04:25.81 |
50 |
5,000 |
2996 |
95 |
46395 |
4406.64 |
15 |
91.09 |
05:33.32 |
|
平均 |
1846.4 |
98.2 |
24143.2 |
2126.17 |
15.18 |
92.28 |
|
クライアントPCパフォーマンス - fx_find.php - 環境K
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1,000 |
872 |
122 |
14200 |
918.68 |
11 |
95.69 |
01:30.67 |
20 |
2,000 |
1775 |
121 |
20326 |
2328.24 |
10.7 |
92.74 |
03:07.42 |
30 |
3,000 |
2363 |
121 |
19098 |
1470.95 |
12.2 |
106.05 |
04:05.96 |
40 |
4,000 |
3278 |
121 |
41041 |
2927.27 |
11.5 |
99.92 |
05:48.12 |
50 |
5,000 |
4110 |
134 |
48557 |
4660.47 |
11.3 |
98.15 |
07:22.95 |
|
平均 |
2479.6 |
123.8 |
28644.4 |
2461.12 |
11.34 |
98.51 |
|
クライアントPCパフォーマンス - fx_find.php - 環境L
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1,000 |
990 |
366 |
2156 |
186.5 |
9.9 |
117 |
01:40.03 |
20 |
2,000 |
2079 |
146 |
20052 |
2099.5 |
9.4 |
109.15 |
03:35.30 |
30 |
3,000 |
2818 |
288 |
25704 |
1567.15 |
10.2 |
120.21 |
04:53.23 |
40 |
4,000 |
4007 |
148 |
40503 |
3180.1 |
9.5 |
112.05 |
06:59.77 |
50 |
5,000 |
5158 |
157 |
51821 |
4679.83 |
9.2 |
108.63 |
09:01.28 |
|
平均 |
3010.4 |
221 |
28047.2 |
2342.62 |
9.64 |
113.41 |
|
クライアントPCパフォーマンス - fx_find.php - 環境M
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1,000 |
1131 |
203 |
2293 |
173.97 |
8.7 |
129.69 |
01:54.56 |
20 |
2,000 |
2442 |
175 |
20218 |
2126.79 |
7.9 |
117.9 |
04:12.24 |
30 |
3,000 |
3370 |
225 |
25315 |
1662.5 |
8.6 |
128.47 |
05:47.32 |
40 |
4,000 |
4764 |
175 |
40021 |
2928.5 |
8.1 |
120.05 |
08:15.74 |
50 |
5,000 |
6133 |
176 |
159254 |
5100.72 |
7.7 |
115.33 |
10:45.08 |
|
平均 |
3568 |
190.8 |
49420.2 |
2398.5 |
8.2 |
122.29 |
|
クライアントPCパフォーマンス - api_find.php - 環境I
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1,000 |
578 |
120 |
948 |
89.9 |
16.9 |
68.43 |
00:59.09 |
20 |
2,000 |
1145 |
103 |
11143 |
673.3 |
16.8 |
67.93 |
01:59.25 |
30 |
3,000 |
1710 |
92 |
21882 |
1745.58 |
16.6 |
67.2 |
03:00.89 |
40 |
4,000 |
2374 |
91 |
36978 |
2875.63 |
15.6 |
63.1 |
04:16.86 |
50 |
5,000 |
2941 |
91 |
49655 |
4514.74 |
15.5 |
62.86 |
05:22.35 |
|
平均 |
1749.6 |
99.4 |
24121.2 |
1979.83 |
16.28 |
65.9 |
|
クライアントPCパフォーマンス - api_find.php - 環境J
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1,000 |
825 |
149 |
1356 |
102.13 |
11.9 |
72.57 |
01:23.43 |
20 |
2,000 |
1645 |
148 |
3049 |
407.05 |
11.9 |
72.52 |
02:47.97 |
30 |
3,000 |
2369 |
142 |
25721 |
2487.79 |
11.7 |
71.44 |
04:15.79 |
40 |
4,000 |
3358 |
134 |
39038 |
3515.36 |
11.2 |
68.49 |
05:55.81 |
50 |
5,000 |
4256 |
143 |
48733 |
4140.66 |
11.1 |
67.68 |
07:30.18 |
|
平均 |
2490.6 |
143.2 |
23579.4 |
2130.6 |
11.56 |
70.54 |
|
クライアントPCパフォーマンス - api_find.php - 環境K
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1,000 |
1101 |
190 |
1747 |
133.39 |
9 |
78.05 |
01:51.52 |
20 |
2,000 |
2234 |
179 |
5113 |
520.52 |
8.8 |
76.86 |
03:46.70 |
30 |
3,000 |
3268 |
196 |
26730 |
2285.39 |
8.8 |
76.42 |
05:42.15 |
40 |
4,000 |
4706 |
177 |
39416 |
3229.58 |
8.2 |
71.2 |
08:09.79 |
50 |
5,000 |
5809 |
188 |
53396 |
4832.8 |
8.2 |
71.2 |
10:09.62 |
|
平均 |
3423.6 |
186 |
25280.4 |
2200.34 |
8.6 |
74.75 |
|
クライアントPCパフォーマンス - api_find.php - 環境L
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1,000 |
1101 |
216 |
15214 |
639.7 |
7 |
81.95 |
20 |
2,000 |
2770 |
215 |
20015 |
1382.08 |
7 |
82.14 |
30 |
3,000 |
4214 |
217 |
19910 |
1421.99 |
7 |
82.24 |
40 |
4,000 |
5757 |
507 |
30614 |
2152.02 |
6.8 |
79.77 |
50 |
5,000 |
7534 |
438 |
48397 |
3762.62 |
6.8 |
77.74 |
|
平均 |
4275.2 |
318.6 |
26830 |
1871.68 |
6.92 |
80.77 |
|
クライアントPCパフォーマンス - api_find.php - 環境M
同時使用ユーザ数 |
総リクエスト数 |
Average[ms] |
Min[ms] |
Max[ms] |
Std. Dev. |
Throughput/sec |
KB/sec |
Time |
10 |
1000 |
1201 |
284 |
3047 |
309.72 |
5.8 |
85.81 |
02:53.21 |
20 |
2000 |
3568 |
422 |
11507 |
956.5 |
5.5 |
82.54 |
06:00.67 |
30 |
3000 |
5565 |
441 |
28205 |
2167.69 |
5.3 |
78.6 |
09:28.48 |
40 |
4000 |
7120 |
263 |
40373 |
2912.94 |
5.4 |
81.19 |
12:14.08 |
50 |
5000 |
9119 |
259 |
50131 |
4149 |
5.3 |
79.08 |
15:42.15 |
|
平均 |
5314.6 |
333.8 |
26652.6 |
2099.17 |
5.46 |
81.44 |
|
FX.php Average集計表
同時ユーザ数 |
$max=10 |
$max=20 |
$max=30 |
$max=40 |
$max=50 |
10 |
463 |
609 |
872 |
990 |
1131 |
20 |
1079 |
1343 |
1775 |
2079 |
2442 |
30 |
1315 |
1806 |
2363 |
2818 |
3370 |
40 |
1828 |
2478 |
3278 |
4007 |
4764 |
50 |
2127 |
2996 |
4110 |
5158 |
6133 |
FileMaker API for PHP Average集計表
同時ユーザ数 |
$max=10 |
$max=20 |
$max=30 |
$max=40 |
$max=50 |
10 |
578 |
825 |
1101 |
1101 |
1201 |
20 |
1145 |
1645 |
2234 |
2770 |
3568 |
30 |
1710 |
2369 |
3268 |
4214 |
5565 |
40 |
2374 |
3358 |
4706 |
5757 |
7120 |
50 |
2941 |
4256 |
5809 |
7534 |
9119 |
|
|
環境I比較 |
環境J比較 |
|
|
環境K比較 |
環境L比較 |
|
環境M比較 |
|
|
FX.phpパフォーマンス |
FileMaker API for PHPパフォーマンス |
|
FX.php & FileMaker API for PHP両パフォーマンス比較 |
前回同様、ソートをおこなうと1リクエストあたりの応答時間が50分を越えるという現実的ではない処理時間になるため、計測対象外とさせていただいた。
ソート・計算/集計フィールド未使用ならほとんど差がでない
一度に取得するレコード数を増やせば増やすほど、FX.php・FileMaker API for PHPともに応答速度が長くなるのは前回検証した結果と同じ。注目したいのはレコード総数が増えても、ソートを使ったり、索引の作成できない計算/集計フィールドを使わなければほとんどパフォーマンス差は出ないというところ。レコード総数5,000件と500,000件とで同時ユーザ数が10のとき、FX.php/APIともに約0.09~0.1秒ほどしか遅くなっていない。APIの一部の結果は、レコード総数が500,000件のほうが早く動作している。
ソートを使った場合、1フィールドのソートだけで応答速度が50分を越えるというとんでもない結果となってしまった。ソートについてはFileMaker Serverを使用せず、FileMaker Proでファイルを直接開いた場合は高速に動作する。FileMaker Serverで公開・共有しているFileMakerファイルをネットワークで開いた場合は同様に遅くなる。これらのことから、FileMakerの作り自体になにかしらの遅くなる原因がありそうだ。この問題が解決しない限り、レコードを大量に扱うWebアプリにおいてソートを用いるべきではないだろう。
計算・集計をどうしても使いたい場合は、この「総レコード数が多くても、ソートや計算・集計フィールドを使わなければパフォーマンスは落ちない」特性を利用して、集計単位別の結果を保持する中間テーブルを用いるのが良いだろう。FileMakerで中間テーブルを利用する方法については、バックナンバー「スピードアップのための徹底チューニング(4) 集計には中間テーブル」を参照してほしい。