質問: いつもお世話になっております。 現在PHPでブラウザからファイルアップロードしてWebサーバーに保存する機能を実装しています。 機能自体は実装し終わっているのですが、ふと「DBに保存する方法もあるんだっけ。どう違うんだろう」と思ったので少し調べてみたら、以下のような文面を見つけました。 > > 自分が作るような小規模なWebアプリケーションなどならパス保存かな > > という印象ですが、ディレクトリ構成なども考えておかないと > > 突然遅くなったりということもあるのでファイルで保存の場合は > > 注意しておきましょう! > > > 【参考】 画像をDBに保存するのか?パスだけ保存するのか? 突然遅くなるというのは、おそらくファイル数(ファイルサイズ?)が膨大になってきた場合に発生するのだろうと考えているのですが、ディレクトリ内の画像数が増えただけでそこまで遅くなるものでしょうか?また、もし遅くなるのだとしたら、画面で表示する時の読込みとPHPで画像を保存する時両方とも遅くなるのですか? 画像ファイル数はMAX10万件程度を想定しています。
回答: ファイルシステムの実装に依存しますが、ディレクトリ直下のファイル数によって遅くなります。 顕著に遅くなるのはファイルの列挙で、ファイル名を直接指定する場合も遅くなることがあります。 例えば、ext3でhTreeが有効化されていない場合、ファイル名を指定したアクセスも線形探索になるそうです。 http://ja.stackoverflow.com/questions/11794/ (それ以前にext3はディレクトリ配下に31998ファイルしか保存できませんけども) ext4を使っていて、ファイル名を直接指定してアクセスするだけであれば、影響は少ないでしょう。 しかし、実際にはファイルを列挙する処理が意外とあるものです。 ファイル数が多くなる見込みなら、ディレクトリを分割したほうが賢明でしょう。