skillup

技術ブログ

PHP

eagar loading vs lazy loading

投稿日:

以前DBからのデータ取得問題でディフォルトだとlazy loadingが発生し、俗にいうN+1問題が発生するので、eagar loadingにすべきみたいな記事を書きました。

joinとeager loading

このときにlazy loadingってどんなメリットがあるのだろう・・と思っていたのですが、大量データをDBから取得する際に、メリットがあると気づきました。

eager loadingとlazy loading

そもそもの前提としてのeagerloadingとlazy loadingですが、一般的にはDBの例の中ででてくることが多いと思います。

例えばJOINなどでデータを取得する際が一番わかりやすいのですが、

eager loadingだと一気にデータを取得しますのでループでデータを発行する際などはイレギュラーなケースでなければ、基本eagerローディングが良いと思います。

よく出てくるのが以下の例だと思います。

【Laravel】Eagerロードについて解説

eager loadingの場合データを取得する際にまとめてデータを取得するので、クエリの発行回数が少なくなります。

で、肝心のlazy loadingですが、そもそもの意図は遅延処理です。webページを読み込んだときに全てのデータを読み込んでから表示されるわけではなく、だんだんと表示されていきます。(画像なんかが多いページだとだんだん画像が表示されることがあるとおもいます。)

この場合、すべての画像を読み込むのが時間がかかるため、このような処理にしているのだと思います。

なのでDBからデータを取得する際も、効果を発揮するケースとしては、大量のデータを取得し、順々にループさせていく・・処理になります。chunkとほぼ同じですね・・

一般的には以下のように

  • 大量データを取得する際に一気に読み込むとメモリを圧迫する
  • 分割処理をすることでメモリを節約できる

などのケースで使います。

LazyCollection備忘録

Laravel クエリビルダ記法まとめ#分割処理

集約の実装とLazy Loading
 

-PHP
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

apacheで複数インスタンスの起動

前回のphpenvがらみの引き続きですが、php5.6と7を共存させ、なおかつWEBアプリで動かす方法を調べたところapacheの複数インスタンスがであれば可能だとのこと。 早速調べなんとかできました …

no image

インメモリデータベース redis

インメモリデータベースのredis(レディース)について。 キャッシュとして以前はmemcachedを使っていましたが、いろいろ多機能ということでredisをちょっと触ってみようかと。 Content …

no image

ループ処理+switch

PHPでちょっと小ネタ foreachやwhileのようなループを抜けるときにcontinueを使うんですが、その中にswitchが入っていると、switchに対してのcontinueがきいてしまって …

no image

wordpressのドメイン移行

WordPressのドメイン以降を行いました。 まあ、このブログの直下にエンジニア集客用ブログをおいたんですがね・・・ http://skill-up-engineering.com/gachinko …

no image

switch(true)イディオム

switch文は通常、文字や数字で分岐をさせることが多いですが、実は条件式を入れることも可能です。 私の場合、正規表現を動的に変えたいケースがあり、検索したところ似たケースがありました。 【JavaS …

アーカイブ