Zasadniczo nie zapisuj plików w bazie danych.
Co na ten temat ma do powiedzenia instrukcja mysql? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html
W przypadku serwerów sieci Web przechowuj obrazy i inne zasoby binarne jako pliki, a nazwa ścieżki jest przechowywana w bazie danych, a nie w samym pliku. Większość serwerów Web lepiej przechowuje pliki w pamięci podręcznej niż zawartość bazy danych, a korzystanie z plików jest generalnie szybsze. (Chociaż w tym przypadku musisz samodzielnie zająć się tworzeniem kopii zapasowych i przechowywaniem).
W ogóle nie zapisuj plików zakodowanych w base4 w bazie danych
Działa dobrze, ale zajmuje tyle czasu, że się spodziewałem. W związku z tym obraz jest o 33% większy i wygląda na całkowicie pękaty.
Jak już odkryłeś, niechciane obciążenie związane z kodowaniem/dekodowaniem + dodatkowe zużycie miejsca, co oznacza również dodatkowy transfer danych tam iz powrotem.
Jak wspomniał @mike-m. Kodowanie Base64 nie jest metodą kompresji. Dlaczego warto używać kodowania Base64, odpowiada również link, który @mike-m opublikował Do czego służy kodowanie Base64?.
Krótko mówiąc, nie ma nic do zyskania, a wiele do stracenia przez obrazy kodujące base64 przed zapisaniem ich w systemie plików, czy to S3, czy w inny sposób.
A co z Gzipem lub innymi formami kompresji bez angażowania base64. Ponownie odpowiedź brzmi, że nie ma nic do zyskania, a wiele do stracenia. Na przykład właśnie spakowałem obraz JPEG 1941980 i zapisałem 4000 bajtów, co daje 0,2% oszczędności.
Powodem jest to, że obrazy są już w skompresowanych formatach. Nie można ich dalej skompresować.
Gdy przechowujesz obrazy bez kompresji, mogą być dostarczane bezpośrednio do przeglądarek i innych klientów oraz mogą być buforowane. Jeśli są skompresowane (lub zakodowane w base64), muszą zostać zdekompresowane przez Twoją aplikację.
Nowoczesne przeglądarki są w stanie wyświetlać obrazy base64 osadzone w kodzie HTML, ale wtedy nie można ich buforować, a dane są o około 30% większe niż powinny.
Czy to wyjątek od normy?
Użytkownik może umieszczać tam dane i obrazy, a wszystko jest bezpieczne.
Zakładam, że masz na myśli, że użytkownik może pobierać obrazy, które do niego należą lub są mu udostępniane. Można to łatwo osiągnąć, zapisując pliki poza obszarem WWW w systemie plików i zapisując tylko ścieżkę w bazie danych. Następnie plik jest wysyłany do klienta (po wykonaniu wymaganych sprawdzeń) z fpassthru
Co jeśli dorosnę do 100000 użytkowników
Jak dbają o plik obrazów. W kwestii wydajności, gdy zaangażowany jest duży użytkownik, wydaje mi się, że potrzebuję folderu 100000 dla użytkownika 100000 i jego podfolderu. Gdy duża liczba użytkowników przegląda ten sam folder główny, w jaki sposób system plików przetwarza każdy unikalny folder.
Użyj CDN lub użyj systemu plików, który jest specjalnie do tego przystosowany, np. BTRFS
Baza danych ma dobre możliwości wyszukiwania, dobre bezpieczne połączenie wątkowe, dobre zarządzanie sesjami. Czy ten scenariusz uległ zmianie, gdy w grę wchodziła duża operacja?
?W rzeczy samej. Wykorzystaj go w pełni, zapisując wszystkie informacje o pliku i jego ścieżce w bazie danych. Następnie zapisz sam plik w systemie plików. Otrzymujesz to, co najlepsze z obu światów.