1. Создаёте двух-трёхуровневую структуру каталогов с именами 00-FF на каждом уровне. Два уровня дают 65536 каталогов нижнего уровня, три - 16777216 каталогов. Можно не создавать сразу все каталоги, а генерировать их по мере надобности.
2. Для сохранения файла считаете его md5, и берёте первые пары символов как имена каталогов. Скажем, если md5 = '1afa148eb41f2e7103f21410bf48346c' то путь будет '1a/fa/14/'. Таким образом файлы окажутся разбросанными по папкам.
3. Генерируете uinqid, cохраняете файл в полученном ранее каталоге под этим uinqid по полученному пути.
4. Записываете полный путь и оригинальное имя файла в базу данных.