Som en tumregel, spara inte filer i databasen.
Vad har mysql-manualen att säga om det? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html
Med webbservrar, lagra bilder och andra binära tillgångar som filer, med sökvägsnamnet lagrat i databasen snarare än själva filen. De flesta webbservrar är bättre på att cache-filer än databasinnehåll, sousing-filer är i allmänhet snabbare. (Även om du måste hantera säkerhetskopior och lagringsproblem själv i det här fallet.)
Spara inte base4-kodade filer i en databas alls
Fungerar bra, men tar så mycket tid som jag förväntade mig. Därför är bilden 33 % större och ser helt ojämn ut.
Som du upptäckte, oönskad omkostnad vid kodning/avkodning + extra utrymme förbrukat vilket innebär extra dataöverföring fram och tillbaka också.
Som @mike-m har nämnt. Base64-kodning är inte en komprimeringsmetod. Varför använda Base64-kodning besvaras också av en länk som @mike-m postade Vad används bas 64-kodning till?
Kort sagt, det finns inget att vinna och mycket att förlora på att base64-koda bilder innan de lagras i filsystemet, vare sig det är S3 eller på annat sätt.
Vad sägs om Gzip eller andra former av komprimering utan att involvera base64. Återigen är svaret att det inte finns något att vinna och mycket att förlora. Till exempel gzippade jag precis en 1941980 JPEG-bild och sparade 4000 byte, vilket är 0,2 % besparing.
Anledningen är att bilderna redan finns i komprimerade format. De kan inte komprimeras ytterligare.
När du lagrar bilder utan komprimering kan de levereras direkt till webbläsare och andra klienter och de kan cachelagras. Om de är komprimerade (eller base64-kodade) måste de dekomprimeras av din app.
Moderna webbläsare kan visa base64-bilder inbäddade i HTML, men då kan de inte cachelagras och informationen är cirka 30 % större än den behöver vara.
Är detta ett undantag från normen?
Användaren kan lägga upp data och bilder där och alla är säkra.
Jag antar att du menar att en användare kan ladda ner bilder som tillhör honom eller delas med honom. Detta kan enkelt uppnås genom att spara filerna från webbutrymmet i filsystemet och endast spara sökvägen i databasen. Sedan skickas filen till klienten (efter att de nödvändiga kontrollerna har gjorts) med fpassthru
Vad sägs om när jag växer till 100 000 användare
Hur de tar hand om bildfilen. I prestandaproblem, när storanvändare är inblandad, tycks det mig, jag behöver 100 000 mapp för 100 000 användare och deras undermapp. När stora mängder användare bläddrar i samma rotmapp, hur filsystemet behandlar varje unik mapp.
Använd ett CDN eller använd ett filsystem som är speciellt lämpat för detta som BTRFS
Databasen har bra sökmöjligheter, bra trådsäker anslutning, bra sessionshantering. Ändras detta scenario när stor operation är inblandad
Ja verkligen. Använd den till fullo genom att spara all information om filen och dess sökväg i databasen. Spara sedan själva filen i filsystemet. Du får det bästa av två världar.