Мысли вслух. Предостережение от наступления на грабли.
Когда-то понадобилось хранить много аттачей. Несколько сот тысяч. ФС и винты тогда были неторопливые, так что надо раскидывать по подкаталогам. Решение очевидно — делаем md5 от уникальных атрибутов файла (скажем, имя, время загрузки, pid загрузки) и кидаем в пару подкаталогов по первым двум символам. Типа ./f4/0e/f40e7bff300851a3554dda25e28af470.jpg
Тогда в расчёте на сотню символов в каталоге получаем среднюю вместимость 256*256*100 = 7млн. Дофига, 640к хватит для всех.
Так оно и есть, блин. Вот только бэкап такой хрени с боевой машины вылился в получасовую операцию. Если не больше. При 100% загрузке io.
Теперь, вот, придётся переделывать на логику YYYY/MM или даже YYYY/MM/DD.
Тогда оперативный бэкап по последним изменениям можно мгновенно делать, задавая конкретный каталог.
Такие, вот, грабли…