Есть связка nginx+Apache. Размер картинок не более 50кб каждая. Количество 100-200 тыс, периодически меняются. Решено хранить в базе только названия файлов, а сами файлы в файловой системе. Имеет ли смысл делать поддиректории или можно хранить все в одной? На сколько это критично с точки зрения производительности?
Если разбивать на поддиректории, то по сколько файлов в каждой или может быть есть другой принцип разбития?
Более чем имеет. Такое количество файлов можно назвать серьёзной нагрузкой на файловую систему (даже ext3 больше 32 000 в одном каталоге не поддерживает). Разбивать рекомендую так: 123456.jpg (6 байт на собственно название без расширения), из них берём последние два символа - первый каталог, вторые два символа - второй каталог, в итоге получается что-то вроде:img/56/34/123456.jpg
Так мы получаем быстрый поиск по файловому дереву, ну и поддержка не самых новых ФС в качестве бонуса.
Кстати, зайдите в /usr/bin, засеките время чтения ФС и количество файлов в нём. Вы увидите насколько может тормозить чтение большого списка файлов.
> из них берём последние два символа - первый каталог, вторые два
> символа - второй каталог, в итоге получается что-то вроде:
> img/56/34/123456.jpgА почему не с первых символов? Что-то вроде
img/12/34/123456.jpg
>> из них берём последние два символа - первый каталог, вторые два
>> символа - второй каталог, в итоге получается что-то вроде:
>> img/56/34/123456.jpg
> А почему не с первых символов? Что-то вроде
> img/12/34/123456.jpgЧтобы равномерно распределить файлы по каталогам, а то на нулях спереди большая часть файлов будет храниться.
> Чтобы равномерно распределить файлы по каталогам, а то на нулях спереди большая
> часть файлов будет храниться.А если имена файлов идут не по порядку? И также содержат буквы (генерятся рандомно)
> А если имена файлов идут не по порядку? И также содержат буквы
> (генерятся рандомно)Тогда надо думать. К каждому методу свой подход.