SQLテーブルの値を一気に読み込むべきか、個々にクエリーを発行するべきか。
2008年1月6日
jit.php のinit()で、次の命令によりskinvar, templatevarのテーブルが一気に読み込まれる。
これに要する時間は、クエリーの発行に約150μ秒、フェッチには一件当たり約7μ秒である。jit.phpでは、コンパイルの際にすべてのskinvarデータが必要だから、上記のように一度に読み込むのが最も効率が良い。一方で、個々にSQLクエリーを発行したほうが効率が良い場合もある。例えば、一つのページを表示する際に、テーブル中の一つのデータしか必要でないときなど。このケースでは、quickQuery()メソッドで一つ一つ呼び出すのが良い。
では、その中間ではどのように処理すればよいか。例えば、メンバー情報などは一つの例である。多数のメンバーが居る際、一つの表示ページ中に記事の著者が一人の場合はquickQuery()の方が早い。他方で、複数の著者の記事を含むページを表示する際は、quickQuery()の方が早い場合と、一気に読み込むほうが早い場合とがある。
M人で経営しているサイトで、一ページあたり、平均してN人の著者の記事が含まれているとする。一気に読み込むほうが早い場合は、
150 + 7 × M < 157 × N
これをグラフにすると、次のようになる。

グラフ中、線より上のケースだと、一気に読み込むほうが早い。このグラフを参考にして、個々に読み込むか、一気に読み込むかを決めることにする。
メンバー情報のケースだと、メンバー数が20人以下で、ページあたり平均して二人以上の著者が含まれている場合、一気に読み込むほうが早い。ほとんどのケースが、これに相当するだろう。仮にメンバー数が100人であったとしてもすべてのデータを読み込むのに850μ秒だから、大きな問題にはならない。メンバー数が一万を超えるなどのケースでは問題が出るが、そういったサイトをJeansで構築すること自体が間違っている。ちなみに、メンバーが一人だけの場合、どちらの方法でもスピードは変わらない。
self::unbuffered_query('SELECT subtype, name, method FROM jit_skinvar WHERE type=<%1%>',$type); $data=array(); while($row=self::fetch_array()){ $data[$row['subtype']][$row['name']]=$row['method']; }
これに要する時間は、クエリーの発行に約150μ秒、フェッチには一件当たり約7μ秒である。jit.phpでは、コンパイルの際にすべてのskinvarデータが必要だから、上記のように一度に読み込むのが最も効率が良い。一方で、個々にSQLクエリーを発行したほうが効率が良い場合もある。例えば、一つのページを表示する際に、テーブル中の一つのデータしか必要でないときなど。このケースでは、quickQuery()メソッドで一つ一つ呼び出すのが良い。
では、その中間ではどのように処理すればよいか。例えば、メンバー情報などは一つの例である。多数のメンバーが居る際、一つの表示ページ中に記事の著者が一人の場合はquickQuery()の方が早い。他方で、複数の著者の記事を含むページを表示する際は、quickQuery()の方が早い場合と、一気に読み込むほうが早い場合とがある。
M人で経営しているサイトで、一ページあたり、平均してN人の著者の記事が含まれているとする。一気に読み込むほうが早い場合は、
150 + 7 × M < 157 × N
これをグラフにすると、次のようになる。

グラフ中、線より上のケースだと、一気に読み込むほうが早い。このグラフを参考にして、個々に読み込むか、一気に読み込むかを決めることにする。
メンバー情報のケースだと、メンバー数が20人以下で、ページあたり平均して二人以上の著者が含まれている場合、一気に読み込むほうが早い。ほとんどのケースが、これに相当するだろう。仮にメンバー数が100人であったとしてもすべてのデータを読み込むのに850μ秒だから、大きな問題にはならない。メンバー数が一万を超えるなどのケースでは問題が出るが、そういったサイトをJeansで構築すること自体が間違っている。ちなみに、メンバーが一人だけの場合、どちらの方法でもスピードは変わらない。