Webアプリケーションを構築する際、データベースエントリに関連付けられたファイルがあることがよくあります。たとえば、user
テーブルがあり、各カテゴリには、avatar
関連付けられた画像へのパスを保持するフィールドがあります。
ファイル名に競合がないことを確認するには、次のいずれかを実行できます。
ID.jpg
。その場合、パスは/user-avatars/ID.jpg
/user-avatars/ID/original_filename.jpg
ここで、IDはのusers
一意のID番号です。
どちらも、アプリケーションロジックの観点からは完全に有効です。
しかし、ファイルシステムのパフォーマンスの観点から、どちらが優れているでしょうか?category
エントリの数が非常に多くなる可能性があることに注意する必要があります(数百万)。
ディレクトリが保持できるサブディレクトリの数に制限はありますか?
ファイルシステムによって異なりますが、ext3のような単純なものについて話していて、分散ファイルシステムを実行していないと仮定します(そのうちのいくつかは非常に優れています)。一般に、ファイルシステムは、それらのエントリがディレクトリであるかファイルであるかに関係なく、単一のディレクトリ内の特定の数のエントリでパフォーマンスが低下します。したがって、イメージごとに1つのディレクトリを作成する場合でも、ルートディレクトリに1つのイメージを作成する場合でも、スケーリングの問題が発生します。あなたがこの答えを見れば:
ディレクトリ内のファイルの数が多すぎますか(WindowsおよびLinuxの場合)?
ext3は、ディレクトリ内の約32Kエントリで制限に達し、提案しているよりもはるかに少ないことがわかります。
頭のてっぺんから、/ user-avatars / 1/2/12345 /original_filename.jpgのようなマルチレベルのディレクトリツリーに基本的なシャーディングを行うことをお勧めします。(または、IDのタイプに適したものですが、質問は数値IDに関するものと解釈しています。)これを行うと、ディレクトリを分散できるため、後でストレージクラスター全体に分散することを決定したときにも作業が楽になります。周り。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加