概要
Laravelでデータベースから大量のデータを取得する場合、シンプルにデータを取得するとメモリの枯渇などが懸念されることがあります。
そんな時、どの取得方法が最適なのかを再考してみました。
1レコードのサイズが大きく、2レコード読み込んだらメモリ枯渇が想定される場合
cursor()を使う!
1レコードずつメモリ展開してくれます。
メモリ展開に対して一番やさしい方法です。
【デメリット】
遅い!
SQLを1レコードずつ実行するわけでは無いが、1レコードごとにDBアクセスが発生するため遅い。
2レコード程度は余裕だけど、さすがに全部を一度に取得するとメモリ枯渇が想定される場合
chunk()を使う!
数百、数千レコードずつなど、一度に取得するレコード数を指定できます。
メモリ展開とSQL実行回数(スピード)ののどちらもバランスよく考える場合に適しています。
【備考】
take()も取得件数が指定できますが、skip()も併用する必要があるため、chunk()を選択した方が良い!
全て一度に取得してもメモリ枯渇が想定されない場合
get()を使う!
これは書くまでもなく一番単純な方法で、これが一番早いのは言うまでもありません。
ただし、全データがメモリに展開されるのでもちろん注意が必要です!
まとめ
基本的にはget()を使ってみて、メモリ枯渇が発生したら、chunk()もしくはcursor()の使用を検討する流れになるのかなと思います。
使用する際にどれがベストだったかの備忘録として記載してみました!
コメント