![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 18.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Mam pytanie, ostatnio wdałem się w interesującą konwersacje z Dr. (nie ważne którym ), który powiedział że lepiej przechowywać obrazki (jpg i inne ) w bazie danych niż w systemie plików. Oczywiście że są zalety i wady tego rozwiązania, lecz mnie interesuje prędkość tych rozwiązań. Ogólnie wiadomo że szybciej powinien działać sposób taki: Zapisujemy obrazek do systemu plików (czyli na dysk twardy) i ścieżkę do bazy danych. I jak chcemy wyświetlić obrazek na stronie to pobieramy z bazy danych ścieżkę do obrazka, i ładujemy obrazek. Ogólnie to zawsze tak robiłem (mysql + php). Szukałem co jest lepsze (szybsze), w necie przechowywanie obrazków w BLOBie czy w Systemie plików. I tutaj jest problem, ogólnie większość programistów piszę że blob jest wolniejszy. Ale UWAGA ![]() Przeszukałem setki stron internetowych i nadal nie wiem, co jest szybsze a co wolniejsze i o ile, bo jeśli tylko o 0.00001 s to nie ma co sobie głowę zawracać, ale jeśli o 1 rząd czy o 2 rzędy to już jest problem. Myślałem że mojego Dr. od razu uciszę argumentem wydajności, i szybkości, jednak nigdzie nie jest czarno na białym napisane, co jest szybsze (wydajniejsze). 2) pytanie, który obrazek zajmie mniej miejsca. Ten w bazie danych, czy w systemie plików. 3) czy obrazek z bazy danych, może być chashowany w przeglądarce. (tzn. z moich eksperymentów, prób - nie ponieważ za każdym odświeżeniem strony jest wczytywany na nowo. Ale może ktoś ma konkretne dane. Porównania czasów) |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
co do analizy wydajności... jak myślisz - gdzie baza danych przechowuje swoje dane? w 99% przypadków w systemie plików... czyli ostatecznie i tak dane obrazka pobierane są z dysku twardego. narzut czasu na pozostałe operacje (połączenie z bazą, interpretacja zapytania, wyszukanie danych) jest w obu rozwiązaniach zbliżony. zatem wniosek jest prosty - nie ma istotnej różnicy w wydajności obu metod. przepustowość systemu plików (i bazy danych) jest i tak o kilka rzędów wielkości wyższa niż przepustowość łącza internetowego do serwera, zatem nawet usiłując przetestować rzeczywistą wydajność obu rozwiązań natkniemy się wcześniej na barierę przepustowości łącza.
wg mnie o wyborze jednej czy drugiej metody decyduje nie wydajność a inne parametry: bezpieczeńswto i spójność danych, przenośność projektu miedzy różnymi platformami, uwolnienie się od ograniczeń niektórych systemów plików, częstotliwość zmian w plikach (przy częstej edycji jednak łatwiej gdy mamy pliki w katalogu a nie w bazie...) itp. -------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 18.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
Dziękuje Ci za odpowiedz,
jednakże to jest znowu tylko pewna teoria nie poparta żadnymi danymi (liczbami). Na każdej stornie internetowej tak jest: - wymiana zalet, wad baz danych, systemu plików i podsumowanie które bierze się z rozumowania autora artykułu notatki. Nawet na wiki nie ma danych tylko to: "Typ blob rozpowszechnił się, kiedy w miarę rozwoju technologii dyski twarde stały się coraz większe i coraz tańsze, a komputery znacznie zwiększyły wydajność, jednak stosowanie blobów wciąż nie jest zalecane przez specjalistów". Skąd mam wiedzieć co tak naprawdę używać, w aplikacji php, java skoro nigdzie nie mam porównania czasów dostępu do danych (plików). Co jest szybsze ? A jeśli bazy danych są wolniejsze to o ile są wolniejsze, może są tylko wolniejsze o kilka milisekund, a ponieważ bezpieczeństwo plików w bazie danych jest lepiej zarządzane to może większość programistów nie ma racji, twierdząc że blob nie jest dobry do przechowywania plików binarnych "ponieważ to jest mniej wydajne". Proszę oto niektóre cytaty i strony z cytatów: ”Niektórzy twierdzą, że nie powinno się przechowywać grafiki w bazie, bo grafika znacznie obciąża serwer MySQL. Duża ilość obrazków i innych plików faktycznie potrafi znacznie obciążyć bazę. Czasami jednak trzeba się oprzeć na bazie danych. ” http://www.diaboli.pl/index.php?site=blob ”Wiem, że ludzie nie polecają umieszczania zdjęć wewnątrz bazy danych - jednak ja w firmie musiałem i opracowałem skrypt do uploadu zdjęcia do bazy MySQL oraz sposób wyświetlania zdjęcia. No ale czasami trzeba robić według wymagań szefa. ” http://forum.kataloog.info/viewtopic.php?t=14 Z nich jasno wynika że programiści, uważają blob za mniej wydajny (wolniejszy). Spotkałem się z innymi zdaniami krytyki dla ludzi którzy chcieli wykonać skrypt galerii przechowując obrazki w BLOBie, nawet na tym forum ![]() Ostatecznie zrobiłem swój skrypt który testuje wczytywania plików z bazy danych z kolumny typu blob i z bazy danych ścieżkę, a później z systemu plików. Niestety na razie źle mi mierzy czas pobrania obrazka z bazy danych a właściwie to mierzy tylko wykonanie wyświetlenia tekstu. "<img src='skrypt.php'" /> Tak czy siak, po dzień dzisiejszy nie mam pojęcia co jest szybsze, tzn nie mam dowodów że szybsza jest baza danych, i nie mam dowodów że szybszy jest system plików. A Dr. którego mam przekonać żąda dowodów. Proszę jeśli widzieliście gdzieś w necie, kiedyś pomiar czasu dostępu, pobierania plików z bazy danych i z systemu plików to proszę wklejcie linka. Jeszcze jedno dodatkowe pytanie: Jak baza danych pobiera dane z bloba. Tzn są dwie wersje: 1) a) Otwiera połączenie (lub korzysta z puli połączeń) ![]() c) zamyka połaczenie d) przesyła dane z bufora/dysku. 2) Wersja 2 a) Otwiera połączenie (lub korzysta z puli połączeń) ![]() c) zamyka połaczenie Dlaczego pytam, ponieważ połączenie do bazy danych kosztuje (ileś ramu, w zależności od wersji bazy danych od kilkukilo do kilkuMB ) jeśli baza danych nie nie musi mieć otwarte połączenie na czas przesyłania danych z bloba to blokuje pule połączeń do bazy. Jeśli natomiast dane zapisuje najpierw na dysk, i później z niego odczytuje dane, to znowu zastanawia mnie szybkość tego rozwiązania. A może baza danych pobiera tylko wskażnik początku danych i czyta dane bezpośrednio z dysku twardego. Masakra, mam jakiegoś pecha do google, pytania nie są proste i oczywiste a wujek google serwuje mi tylko gdybanie. ![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 78 Pomógł: 15 Dołączył: 10.12.2007 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Sprawa rzeczywiście jest dość interesująca i wymagająca przetestowania, może się nawet podejmę czegoś takiego w ciągu najbliższego miesiąca, bo i tak mam sporo benchmarków do zrobienia z Apachem, PHP i MySQL
![]() Tak bez robienia badań, na szybko odpowiem... co do wersji 1) Łączysz się z bazą,
co do wersji drugiej Czy to w tym samym połączeniu ma pobierać rysunki co i inne dane do strony? Czy rysunki mają być zagnieżdżone bezpośrednio w HTML'a (chyba coś takiego raz widziałem, ale głowy nie dam)?, jak nie to musisz dać linki do innych plików, które dopiero mają się połączyć do Bazy... To są na razie przemyślenia, kolejne bez dowodów możesz dodać, ale zobaczymy co z tego wyjdzie. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
Cytat Skąd mam wiedzieć co tak naprawdę używać, w aplikacji php, java skoro nigdzie nie mam porównania czasów dostępu do danych (plików). Co jest szybsze ? Wydawało mi się, że odpowiedziałem ci na to pytanie... Nieistotne, co jest szybsze, bo bez względu na wariant pobrania pliku (baza albo system plików) czas tego pobrania będzie o rząd wielkości MNIEJSZY od czasu jego PRZESŁANIA przez internet. Stąd wybór jednej albo drugiej metody ma MARGINALNY wpływ na szybkość przesłania obrazków do przeglądarki. Żądasz liczb? Proszę bardzo. Typowe dyski z interfejsem SATA oferują przepustowość rzędu 150 Mb/s, a średni czas wyszukiwania jest rzędu 10ms. Plik graficzny o rozmiarze 100kB (kilobajtów), to w rzeczywistości 800kb (kilobitów) czyli 0,8Mb. Zatem czas pobrania tego pliku "do pamięci" jest rzędu 15 ms (10ms wyszukanie, 5ms odczyt). Zakładając, że zgodnie z marudzeniem leniwych programistów odczyt z bazy jest zacznie mniej wydajny (a naprawdę chodzi tylko o to, że trzeba trochę się wysilić i dodatkowego kodu napisać) - niech pobranie z bazy zajmie nam 30ms. A jaka jest typowa przepustowość łącza internetowego po stronie klienta (użytkownika naszego systemu)? Optymistycznie zakładam, że 2Mb/s. Tym samym przesłanie 100kB obrazka zajmie ok. 0,4 sek. (400ms - teoretycznie, w rzeczywistości ok 1 000 ms). Mam nadzieję, że teraz jasno widzisz, że na wydajność podtawowy wpływ ma prędkość transferu przez sieć, czas pobrania obrazka z pliku lub z bazy jest w zasadzie NIEISTOTNY. Powodzenia. Ten post edytował nevt 16.03.2008, 22:51:53 -------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 18.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
Hmm, no w sumie logicznie rzecz biorąc masz racje.
Tylko dlaczego 99% wypowiedzi na forach internetowych, na pomysł przechowywania plików graficznych w bazach danych, odradza tego pomysłu ? [wystarczy w google wpisać: "galeria blob"]. Dlaczego w każdej [ każdej nie czytałem ![]() Według mnie to nawet łatwiej jest zapisać plik do bazy danych, niż na dysk. Hmm. Zrobiłem skrycik który testuje pobieranie z pliku i bazy danych:
Ogólnie cały skrypt działa na www.mariopce.tivi.net.pl/blob/aaa.php Podałem ten skrypt z 2 powodów: 1) Pokazać łatwość wykonania 2 sposobów dostępu do danych 2) Poprosić was o pomoc z mierzeniem czasu ładowania obrazków z bazy danych, czyli z zewnętrznego skryptu: view1.php. Funkcja:
Mierzy tylko czas generowania strony php, bez ładowania zewnętrznych grafik. 3) Żebyście zobaczyli że pliki które pobierane są z bloba nie są cashowane przez przeglądarkę. tzn. jak wciśniecie 5x F5 to plik graficzny z bloba będzie wczytany z bazy danych, gdy wczytujemy z bazy danych tylko ścieżkę do pliku, to już jest inaczej, co prawda pobór ścieżki trawa, ale sam plik graficzny jest cashowany.. Chyba że w tym skrypcie popełniłem jakiś błąd ? Jeśli dane binarne z bloba nie są cashowane przez przeglądarkę to tutaj w tym miejscu byłby największy minus, bloba. Jeśli natomiast ktoś znajdzie skrypt który powoduję ze dane binarne będą cashowane to okaże się że więcej zalet ma blob. Teraz jeszcze jedno stwierdzenie: Pliki graficzne można łatwiej zmieniać, np. robić miniaturki. gdy mamy dane zapisane w pliku a nie w bazie danych, [prawda czy fałsz ?] Ogólnie to im więcej czytam o tym blobie tym więcej nie wiadomych niż wiadomych. Dziękuje Ci za wyjaśnienie że gardłem dla plików jest sieć internetowa, może więc blob, nie jest taki straszny jak go malują, i powinniśmy przekonywać do używania blobów, zamiast systemu plików które mają wady. |
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
1. Co do cache przeglądarki - bywa, że jest to cel sam w sobie - wyłączenie cache, żeby mieć 100% gwarancje, że użytkownik widzi aktualna wersję.
2. Blob ma przewagę, gdy musimy zaimplementować skomplikowane mechanizmy dostępu do danych - załóżmy że te obrazki to nie zwykłe graficzki ale skany dokumentów. W systemie plików wszystkie grafiki będą dostępne do odczytu przez przeglądarkę... 3. Kolejny plus dla bloba, jeżeli istnieje potrzeba udostępnienia użytkownikom możliwości aktualizacji / edycji tych plików - system plików jako taki nie ma mechanizmów wspierających rozwiązywanie konfliktów przy jednoczesnej edycji przez wielu użytkowników - a baza danych tak - chociażby poprzez tranzakcje. 4. W sytuacji, gdy potrzebujemy zaimplementować system wersjonowania tych grafik - znacznie prostsze będzie zrobienie tego bezpośrednio w bazie danych. Podsumowując, uważam, że w typowych zastosowaniach internetowych (elementy layouty, proste ilustracje lub galerie do publikowanych treści) zdecydowanie prostsze jest korzystanie z plików przechowywanych bezpośrednio na dysku. Jednak w przypadku zaawansowanej aplikacji, stawiającej specyficzne wymagania, jak w przykładach powyżej, w NIEKTÓRYCH, sporadycznych przypadkach przewagę zyskuje przechowywanie grafik w bazie danych. Czyli niewłaściwym pytaniem, jest ogólne: co jest lepsze / wydajniejsze ? pliki czy blob? Właściwym pytaniem jest co jest lepsze / wydajniejsze do implementacji konkretnego zadania ? Pozdrawiam wszystkich. Ten post edytował nevt 17.03.2008, 08:07:23 -------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 3 Dołączył: 20.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
Częstym powodem dla którego podaje się powód przechowywania obrazków w bazie danych jest większa kontrola dostępu do tych danych, ale mod rewrite daje możliwośc kontrolowania dostępu do plików, które znajdują się na serwerze. I moje pytanie jest nastepujące:
Czy jest możliwośc dynamicznego dawania uprawnień do zobaczenia konkretnych plików? Chodzi o to żeby php dawało argumenty do pliku pliku .httacces i serer decydowałby czy wyslac plik/obrazek do uzytkownika. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 01:39 |