Efektivita MySQL při uložení velkého XML

Thugmek

Efektivita MySQL při uložení velkého XML
« kdy: 01. 06. 2017, 17:33:28 »
Dobrý den, víte někdo jak MySQL vyhledává v databázi? Dělám takovou hříčku, něco jako Travian (pravděpodobně to nikdy nikdo nebude hrát) a potřebuju tabulku hráčských vesnic, kde bude vlastník, poloha a pak velkej XML soubor obsahující všechny informace o vesnici (suroviny, budovy, jednotky...). Jak moc bude ten XML soubor databázi zpomalovat když budu například vykreslovat mapu (načte se všechno kromě toho XML)?
« Poslední změna: 01. 06. 2017, 19:07:53 od Petr Krčmář »


Re:efektivita MySQL
« Odpověď #1 kdy: 01. 06. 2017, 18:19:43 »
Pokud bude dlouhý, měl by být uložený mimo takže při selektu bez XML by to mělo být jedno.
Do nějaké velikosti domnívám se do 64kB se vkládá rovnou mezi data v tabulce.

V případě nouze si myslím, že i v produkci není problém to odhodit do jiné tabulky.

Dobrý den, víte někdo jak MySQL vyhledává v databázi? Dělám takovou hříčku, něco jako Travian (pravděpodobně to nikdy nikdo nebude hrát) a potřebuju tabulku hráčských vesnic, kde bude vlastník, poloha a pak velkej XML soubor obsahující všechny informace o vesnici (suroviny, budovy, jednotky...). Jak moc bude ten XML soubor databázi zpomalovat když budu například vykreslovat mapu (načte se všechno kromě toho XML)?
„Řemeslo se naučí každý. Umění nikdo.“
„Jednoduchost je nejvyšší úroveň sofistikovanosti.“
- Leonardo Da Vinci

O.

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #2 kdy: 01. 06. 2017, 19:35:50 »
Neni lepsi mit ty XML soubory na disku a v DB sloupecku mit jen cestu k souboru?   

Štefan

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #3 kdy: 01. 06. 2017, 20:19:30 »
Pokud už musíš mít ty data v XML, dal bych ho do separátní tabulky, vzhledem k tomu, že ho nepotřebuješ číst pořád.
Ale vážně bych se zamyslel nad tím, jestli by nebylo lepší ty data normalizovat a mít je jako regulérní tabulku..

Trupik

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #4 kdy: 01. 06. 2017, 20:45:17 »
Pokud už musíš mít ty data v XML, dal bych ho do separátní tabulky, vzhledem k tomu, že ho nepotřebuješ číst pořád.
Ale vážně bych se zamyslel nad tím, jestli by nebylo lepší ty data normalizovat a mít je jako regulérní tabulku..
Ak experimentuje, tak možno nemá dopredu vymyslenú pevnú štruktúru dát pre "vesnici". Alebo si netrúfa so svojou znalosťou SQL nasypať tam všetko. Podľa mňa je oboje v poriadku.
Čo by som zvážil, je vykašľať sa na XML (ak nechce robiť XSLT transformácie) a držať to ako JSON. Je kompaktnejší a parsuje sa rýchlejšie. Na webe je tiež možné ho poslať AJAXom do prehliadača, kde sa absolútne jednoducho stane objektom Javascriptu a dá sa s ním ďalej pracovať.


3ugeene

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #5 kdy: 01. 06. 2017, 21:12:54 »
a proč to musí být xml soubor?

3ugeene

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #6 kdy: 01. 06. 2017, 21:14:50 »
pardon, mezitim přišly odpovědi....


JSON je lepší, ale proč nemít ta data v separátní(ch) tabul(ce|kách)?

dustin

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #7 kdy: 01. 06. 2017, 21:25:35 »
Kolik těch XMLek bude? Když to dáš jako typ text/mediumtext, v rozumných počtech řádků to mysql zvládne úplně v pohodě. Samozřejmě předpokládám správné indexy a že v tom nebudeš hledat přes like.

Na všechny tvé tabulky engine innodb s nastavením innodb_file_per_table.

Kit

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #8 kdy: 01. 06. 2017, 21:47:56 »
XML je obvykle lépe na disku v podobě souboru. Kombinace XML s databází nebývá příliš výhodná.

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #9 kdy: 02. 06. 2017, 12:26:35 »
XML je obvykle lépe na disku v podobě souboru. Kombinace XML s databází nebývá příliš výhodná.

Naopak, kombinace XML (nebo JSON) s databází je velmi výhodná, pokud daný db engine dokáže s XML/JSON pracovat. Můžeš si nad nimi dělat ad hoc dotazy a dokonce i indexy. Bohužel nevím jak je na tom zrovna MySQL, už přes deset let používám jen DB2 a Postgresql.
Disclaimer: Samozřejmě, neporovnávám XML/JSON s korektní normální formou, ta je vždy pro hledání lepší.

Kombinace souborů na disku s databází je naopak velmi nevýhodná, a to hned z několika důvodů:
  • Buď může existovat jen jeden klient (který má u sebe ty soubory), nebo musí všichni klienti sdílet nějaký filesystém. Ne že by to nešlo, s takovým NFS si člověk užije spousty zábavy když vypadne spojení...
  • Práce se soubory není součástí transakce. Je ošetřit všechny kombinace rollbacku a chyb FS, jinak se bude stávat že chybí soubor odkazovaný z db, nebo naopak na fs nějaký přebývá. O současné změně obsahu souboru ani nemluvě.
  • Pokud už někdy chceš hledat uvnitř (v podstatě nutné při ručním řešení problémů), tak musíš ručně spojovat nějaký grep/xmlstarlet/jq a SQL dotaz.
Samozřejmě, pokud se jedná o významné objemy dat, tak se nedá nic dělat a všechny výše uvedené problémy řešit. A samozřejmě, někdo má rád výzvy :-)

dustin

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #10 kdy: 02. 06. 2017, 21:57:39 »
V původním dotazu není o vyhledávání v tom XML nic, IMO to chce jen ukládat a pak vytahovat.

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #11 kdy: 03. 06. 2017, 10:07:40 »
V původním dotazu není o vyhledávání v tom XML nic, IMO to chce jen ukládat a pak vytahovat.
Jo, to si možná myslí teď, ale podle toho co do nich chce ukládat (cituji: suroviny, budoviny, jednotky) je mi jasné že hned druhý den bude potřebovat najít kolik má prázdných vesnic apod.

Kit

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #12 kdy: 03. 06. 2017, 10:43:42 »
V původním dotazu není o vyhledávání v tom XML nic, IMO to chce jen ukládat a pak vytahovat.
Jo, to si možná myslí teď, ale podle toho co do nich chce ukládat (cituji: suroviny, budoviny, jednotky) je mi jasné že hned druhý den bude potřebovat najít kolik má prázdných vesnic apod.

suroviny, budoviny, jednotky... Zřejmě do toho bude chtít během hry i zapisovat změny, což je další argument proti použití XML. Tohle vypadá spíš na klasické použití normalizované databáze SQL, tedy bez XML.

Pokud by to měla být NoSQL databáze, tak asi Redis, protože nabízí i kolekce, které by zde mohly najít uplatnění. Při troše šikovnosti by ani nemusely chybět transakce.

3ugeene

Re:Efektivita MySQL při uložení velkého XML
« Odpověď #13 kdy: 03. 06. 2017, 14:53:11 »
zatim je to v poho, protoze po nas nechce vymyslet kompletni reseni

Tomas2

  • ****
  • 310
    • Zobrazit profil
    • E-mail
Re:Efektivita MySQL při uložení velkého XML
« Odpověď #14 kdy: 04. 06. 2017, 11:15:20 »
MySQL má datový typ blob, jeho obsah je uložený mimo zbytek řádku jako soubor a jeho přítomnost nemá vliv na zbytek práce s řádkem.

Obecně ale takovéhle ulehčení není vhodné, narazíš s tím, když budeš chtít třeba dělat statistiku nebo celkový přehled několika údajů, bude to náročné. Velice problematické to je v případě, kdy časem budeš měnit/rozšiřovat strukturu těhle dat, doménová logika pak bude obsahovat zbytečně hodně ifů nebo musíš jednorázově transformovat všechny tyhle xml.

Raději to uloži do databáze ve formě key, value.