Como regla general, no guarde archivos en la base de datos.
¿Qué dice el manual de mysql al respecto? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html
Con servidores web, almacene imágenes y otros activos binarios como archivos, con el nombre de la ruta almacenado en la base de datos en lugar del archivo en sí. La mayoría de los servidores web son mejores para almacenar en caché los archivos que el contenido de la base de datos, por lo que el almacenamiento de archivos suele ser más rápido. (Aunque en este caso usted mismo debe encargarse de las copias de seguridad y los problemas de almacenamiento).
No guarde archivos codificados en base4 en una base de datos
Funciona bien, pero toma tanto tiempo del que esperaba. Por lo tanto, la imagen tiene un tamaño un 33 % más grande y se ve totalmente abultada.
Como descubrió, la sobrecarga no deseada en la codificación/descodificación + espacio adicional utilizado, lo que significa también una transferencia de datos adicional de ida y vuelta.
Como ha mencionado @ mike-m. La codificación Base64 no es un método de compresión. Por qué usar la codificación Base64 también se responde en un enlace que @mike-m publicó ¿Para qué se usa la codificación base 64?
En resumen, no hay nada que ganar y mucho que perder codificando imágenes en base64 antes de almacenarlas en el sistema de archivos, ya sea S3 o de otro tipo.
¿Qué pasa con Gzip u otras formas de compresión sin involucrar a base64? Una vez más, la respuesta es que no hay nada que ganar y mucho que perder. Por ejemplo, acabo de comprimir una imagen JPEG de 1941980 y guardé 4000 bytes, lo que representa un ahorro del 0,2 %.
La razón es que las imágenes ya están en formatos comprimidos. No se pueden comprimir más.
Cuando almacena imágenes sin compresión, se pueden entregar directamente a los navegadores y otros clientes y se pueden almacenar en caché. Si están comprimidos (o codificados en base64), su aplicación debe descomprimirlos.
Los navegadores modernos pueden mostrar imágenes base64 incrustadas en el HTML, pero luego no se pueden almacenar en caché y los datos son aproximadamente un 30 % más grandes de lo necesario.
¿Es esto una excepción a la norma?
El usuario puede publicar allí datos e imágenes y todo es seguro.
Supongo que te refieres a que un usuario puede descargar imágenes que le pertenecen o compartir con él. Esto se puede lograr fácilmente guardando los archivos fuera del espacio web en el sistema de archivos y guardando solo la ruta en la base de datos. Luego, el archivo se envía al cliente (después de realizar las comprobaciones necesarias) con fpassthru
¿Qué pasa cuando crezca a 100000 usuarios?
Cómo cuidan el archivo de imágenes. En el problema de rendimiento, cuando hay un gran usuario involucrado, me parece que necesito 100000 carpetas para 100000 usuarios y su subcarpeta. Cuando una gran cantidad de usuarios navegan por la misma carpeta raíz, cómo el sistema de archivos procesa cada carpeta única.
Use un CDN o use un sistema de archivos que sea especialmente adecuado para esto como BTRFS
La base de datos tiene una buena función de búsqueda, una buena conexión segura para subprocesos, una buena gestión de sesiones. ¿Este escenario cambia cuando se trata de una gran operación?
Sí, de hecho. Úselo al máximo guardando toda la información sobre el archivo y su ruta de archivo en la base de datos. Luego guarde el archivo en el sistema de archivos. Obtienes lo mejor de ambos mundos.