(Dlouho to ve mě hlodalo, nejsa databázistou, po půl hodině práce s google results.) Otázka je: mám velký soubor (150MB .avi) - mám ho uložit do databáze nebo radši na disk?
Rychlá odpověď:
Solidní odpověď si složte z následujících faktů.
- db ukládá tyhle věci do BLOB, LONGBLOB
- do BLOB sloupečku je možné soubor z filesystému uložit přes funkci LOAD_FILE
- velikost dat, která nahrávám přes INSERT/UPDATE, je omezená parametrem
max_allowed_packet
- jakmile je sloupeček typu BLOB, MySql (a) tabulku vždycky ukládá na disku (bez něj to může být i v paměti), (b) z BLOBové položky používá prvních
max_sort_length
(default 1024) znaků pro ORDER BY apod řazení výsledků
- jakmile MySql dělá SELECT a v prohledávaných sloupcích je BLOB, prohledává tabulky na disku a ne v paměti => je to velmi pomalé (tohle se stane třeba když udělám SELECT * FROM TABULKA_S_FILMY)
- když udělám SELECT s BLOBy a pracuji s ním v aplikaci (přes result set), další krok iterace přes result set vždy čeká na dodání celého BLOBu což může zdržovat
- když čtu data ze souboru a/nebo je z něj odesílám na klienta, můžu to spusit v separátním vlákně
- když mám data filmů v db, zálohováním databáze se zálohují i filmy; když je mám na disku, musím krom databáze zálohovat i soubory
- některé filesystémy mají problém pokud mají pracovat s řádově miliony (malých) souborů; pokud mám řádově milion (malých) souborů v BLOBech, jsou fyzicky v jednom či dvou velkých souborech příslušné tabulky
- když mám filmy jen v databázi, nedostanu se k nim z jiných aplikací jednoduchým přístupem do filesystemu
(Pozn: Vše se týká MySql ale zřejmě platí obecně pro rozumné SQL databáze.)
Best practices pro ukládání v db:
- oddělit "metadata" souboru od "dat" do dvou tabulek
- pro optimalizaci zasílání dat ke klientovi a/nebo práci s nimi v aplikační logice se může hodit rozdělit je do menších (např. 64KB) bloků
Oboje viz http://www.dreamwerx.net/phpforum/?id=1.
Poznámka k ukládání v OpenCms
Nedělat (neukládat .avi do VFS), protože na to OpenCms nemá udělané VFS tabulky - kdyžtak vytvořit vlastní tabulky pro velká data a spravovat si je "ručně".