Como regra geral, não salve arquivos no banco de dados.
O que o manual do mysql tem a dizer sobre isso? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html
Com servidores Web, armazene imagens e outros ativos binários como arquivos, com o nome do caminho armazenado no banco de dados em vez do próprio arquivo. A maioria dos servidores da Web são melhores no armazenamento de arquivos em cache do que o conteúdo do banco de dados, a remoção de arquivos geralmente é mais rápida. (Embora você deva lidar com backups e problemas de armazenamento neste caso.)
Não salve arquivos codificados em base4 em um banco de dados
Funciona bem, mas demora tanto tempo que eu esperava. Portanto, a imagem é 33% maior e parece totalmente volumosa.
Como você descobriu, sobrecarga indesejada na codificação/decoing + espaço extra usado, o que significa transferência extra de dados para frente e para trás também.
Como @mike-m mencionou. A codificação Base64 não é um método de compactação. Por que usar a codificação Base64 também é respondido por um link que @mike-m postou Para que é usada a codificação base 64?.
Em suma, não há nada a ganhar e muito a perder com as imagens de codificação base64 antes de armazená-las no sistema de arquivos, seja S3 ou não.
E quanto ao Gzip ou outras formas de compactação sem envolver a base64. Novamente a resposta é que não há nada a ganhar e muito a perder. Por exemplo, acabei de compactar uma imagem JPEG 1941980 e salvei 4000 bytes, o que representa uma economia de 0,2%.
O motivo é que as imagens já estão em formatos compactados. Eles não podem ser compactados mais.
Quando você armazena imagens sem compactação, elas podem ser entregues diretamente aos navegadores e outros clientes e podem ser armazenadas em cache. Se eles estiverem compactados (ou codificados em base64), eles precisam ser descompactados pelo seu aplicativo.
Os navegadores modernos são capazes de exibir imagens base64 incorporadas ao HTML, mas não podem ser armazenadas em cache e os dados são cerca de 30% maiores do que o necessário.
Isso é uma exceção à norma?
O usuário pode postar dados e imagens e todos são seguros.
Presumo que você queira dizer que um usuário pode baixar imagens que pertencem a ele ou compartilhadas com ele. Isso pode ser facilmente alcançado salvando os arquivos do espaço da web no sistema de arquivos e salvando apenas o caminho no banco de dados. Em seguida, o arquivo é enviado ao cliente (depois de fazer as verificações necessárias) com fpassthru
E quando eu chegar a 100.000 usuários
Como eles cuidam do arquivo de imagens. Em questão de desempenho, quando largeuser envolvido, parece-me que preciso de 100.000 pastas para 100.000 usuários e sua subpasta. Quando uma grande quantidade de usuários navega na mesma pasta raiz, como o sistema de arquivos processa cada pasta exclusiva.
Use um CDN ou use um sistema de arquivos especialmente adequado para isso, como BTRFS
O banco de dados tem um bom recurso de pesquisa, boa conexão segura de thread, bom gerenciamento de sessão. Este cenário é alterado quando uma grande operação envolvida
Sim, de fato. Use-o ao máximo salvando todas as informações sobre o arquivo e seu caminho no banco de dados. Em seguida, salve o próprio arquivo no sistema de arquivos. Você obtém o melhor dos dois mundos.