Autor | Zpráva | ||
---|---|---|---|
matak Profil |
dá se to nějak řešit v mysql5? největší problém mi dělá hromadný insert, jinak bych samozřejmě použil last_insert_id a do dalších tabulek vkládal s nastaveným id, ale co když jde o složený insert
table id PRIMARY AUTO_INCREMENT desc TEXT INSERT INTO table (desc) VALUES ("ahoj"), ("nazdar") no a nejhorsi je ze bych to potreboval vlozit jeste do druhe tabulky ale s vazbou na primarni klice table2 id PRIMARY AUTO_INCREMENT meta TEXT INSERT INTO table2 (meta) VALUES ("nějaké meta k ahoj ale nevím jaký mám primaryID"), ("nějaké meta k nazdar ale nevím s jakým ID protože mezi tím už mohl někdo vložit další záznam a primary id by nesouhlasilo") Díky všem za tipy a rady |
||
Kajman_ Profil * |
#2 · Zasláno: 11. 12. 2007, 16:34:00
Tak to ukládejte po jednom.
|
||
matak Profil |
#3 · Zasláno: 11. 12. 2007, 16:40:00
15000 záznamů??
takovou transakci si může dovolit jen málokterý web, zvlášť když celková velikost je 20mb což může být hodně dlouho |
||
Aesir Profil |
#4 · Zasláno: 11. 12. 2007, 16:50:46
matak
15000 záznamů?? takovou transakci si může dovolit jen málokterý web, zvlášť když celková velikost je 20mb což může být hodně dlouho Takovou transakci nad živou databází si může dovolit jen málokterý správce. Prostě udělat druhou db, do té to nacpat data nějakým skriptem, poté odříznout nad webserverem na chvíli lid zvenku a zreplikovat data do živé db, to už bude na cvhíli. |
||
djlj Profil |
#5 · Zasláno: 11. 12. 2007, 16:51:12 · Upravil/a: djlj
Vždyť to je tak za 2 minutky hotový.
A pokud je struktura taková, jakou popisuješ, možná by bylo vhodnější použít jedinou tabulku. A mimochodem, nějak ti blbne klávesnice — omylem ti píše velkými písmeny; zkus na to mrknout, asi blbne Caps lock. |
||
matak Profil |
#6 · Zasláno: 11. 12. 2007, 17:15:54
2 minutky nejsou zrovna málo konkrétně je to na 3.43 minutky na hodně výkonném stroji, za ty dvě minutky ovšem může přibýt pár záznamů o které bych přišel a to si také nemůžu dovolit, jinak mysql jestli se nemýlím tak postupuje podle popsaného schématu, vloží nejdříve jinam a pak přejmenuje na tu samou tabulku? tak nevím jestli je důležité zda je to živá databáze nebo ne? třeba se mýlím
použít jednu tabulku nelze, právě jsem to raději rozsypal do deseti, ono 100 sloupců není asi úplně košér nehledě na to, že při většině dotazů se nebudou číst všechny údaje a proto není nutné projíždět tabulkou o velikosti 100MB ale dle mého je lepší selectovat tabulku o 1MB a k tomu připojit věc kterou zrovna v tom dotazu chci z jedné z dalších tabulek o velikosti 20MB ?? proto je to rozsipané na více tabulek To proč to nehcci dělat po jednom jen, že nikdy dopředu nevím kolik záznamů se bude zpracovávat někdy 100 někdy 1000, při té stovce by to chtělo celkem svižnou odezvu. A pak tady mám jednu situaci kdy je nutné mít v jiné tabulce párový klíč právě vloženého záznamu, takže: 1. tabulek musí být více je proto spousty důvodů 2. akce může mít hodně záznamů nebo málo, může být částá nebo jednou za den |
||
matak Profil |
#7 · Zasláno: 11. 12. 2007, 17:16:26
A mimochodem, nějak ti blbne klávesnice — omylem ti píše velkými písmeny; zkus na to mrknout, asi blbne Caps lock.
záleží na tom??? nechápu, ale to asi nevadí |
||
Aesir Profil |
#8 · Zasláno: 11. 12. 2007, 17:39:55
matak
Chápu správně, že table2 je provázána na table1 přes sloupec id? Jestli ano, tak potom nechápu auto_increment u jedné z těchto tabulek. Řešil bych to insertem, který mi vygeneruje nějaký skript z dat, jak jsem již psal výše, tedy něco jako: INSERT INTO table (id, value) VALUES (id1, value1), (id2, value2) ... a druhou tabulku naplníte stejným způsobem s tím, že můžete použít pro spojení vnořený select. Pokud to stále nechápu, tak ať raději poradí někdo jiný, nebo mi to nakreslete :P |
||
djlj Profil |
#9 · Zasláno: 11. 12. 2007, 17:43:56 · Upravil/a: djlj
matak
Zkus si pro příště pročíst sekci závazná pravidla. (A to pomíjím, že text psaný caps lockem vyznívá dost dementně.) Zkoušels do těch insertů dát něco ve smyslu: INSERT INTO table2(meta) VALUES((SELECT id FROM table WHERE desc='ahoj'), ...? 2 minutky nejsou zrovna málo konkrétně je to na 3.43 minutky na hodně výkonném stroji, za ty dvě minutky ovšem může přibýt pár záznamů o které bych přišel a to si také nemůžu dovolit Dělej to v noci. Aesir Taky to nechápu :). |
||
matak Profil |
#10 · Zasláno: 11. 12. 2007, 17:52:46
1. provázání souhlasí
vztah 1:1 2. bez autoincrementu tak nějak nevím kde vzít to id? table1 id PRIMARY config1 TINYINT(1) config2 TINYINT(1) config3 TINYINT(1) config4 TINYINT(1) config5 TINYINT(1) table2 id PRIMARY text TEXT text1 TEXT text2 TEXT table3 id PRIMARY name VARCHAR name2 VARCHAR name3 VARCHAR kazdý záznam do tabulky table1 se musí projevit i v table2 a table3 mám sadu záznamů pro zjednodušení např v csv soubor table1.csv radek - config1;config2;config3;config4;config5 radek - config1;config2;config3;config4;config5 radek - config1;config2;config3;config4;config5 radek - config1;config2;config3;config4;config5 soubor table2.csv radek - text1;text2;text3 radek - text1;text2;text3 radek - text1;text2;text3 radek - text1;text2;text3 soubor table3.csv radek - name1;name2;name3 radek - name1;name2;name3 radek - name1;name2;name3 radek - name1;name2;name3 a tyhle csv soubory potrebuji nasypat do dtb a radky samozrejme mezi sebou provazane je to jen priklad ted vymysleny pro pochopeni treba to neni uplne stastne |
||
matak Profil |
#11 · Zasláno: 11. 12. 2007, 17:57:51
DÍKY VŠEM ZA TIPY A RADY
sory, vadí ti to hodně?? není to zbytečná buzerace? pripadá mi 5 příspěvků kvůli 6 slovům napsaným capslockem jako porušení pravidel a jestli to není tak by mělo být, protože to mě spíš štve víc, je tady zbytečný balast 1. dělat v noci to nelze, dělat se to musí kdy je potřeba (ať už jakkoli přesun v čase neřeší problém) 2. Zkoušels do těch insertů dát něco ve smyslu: INSERT INTO table2(meta) VALUES((SELECT id FROM table WHERE desc='ahoj'), ...? neřeší problém spíš vytváří nový, 15000 insertů a dalších 15000 selectů a dalších 15000 insertů pro každou table mě nepřijde jako dobrý nápad, description je vždy jiný samozřejmě anebo také stejný |
||
Aesir Profil |
#12 · Zasláno: 11. 12. 2007, 19:09:18
matak
Takže se jedná o jakésy pravidelné importy, jest tak? Jak jsou provázány mezi sebou jednotlivé řádky mezi csv soubory? Spoléháte na správné pořadí řádků a v databázi na autoinkrementální sloupec? Pokud ano, tak pozor na integritu dat, je to docela hazard. Pokud to chcete nahrávat soubor po souboru, tak můžete využít LOAD DATA a spoléhat na zámek tabulek. Pokud to chcete udělat pořádně, předělejte impot do jednoho souboru, kde jeden řádek bude jeden záznam s jedinečným identifikátorem. Soubor pak ve skriptu parsujte řádek po řádku a data si rozházejte do libovolných tabulek, propojených právě tím jediným a jedinečným identifikátorem. |
||
matak Profil |
#13 · Zasláno: 11. 12. 2007, 19:33:22
1. dejme tomu ze to jsou importy dá se to tak specifikovat
jinak sory jestli jsem v predchozi diskusi tykal jsem na to zvykli z diskusi stejne nikdy nevim s kym se opravdu bavim, pokud to neni problem navrhuji LOAD DATA využívám, ale to není podstatné, integrita je a pořádí řádků je zaručeno, tabulka kde je vše je vytvořena a úspěšně funguje, ovšem jsme zpět na stejném problému mám jednu tabulku a potřebuji z ní přesunout data do 5 jiných tabulek, ve kterých se tyto data vytvářejí a jsou navzájem provázány unikátním id, které ovšem je logicky známé až po vložení do hlavní tabulky a to je problém, tak jinak mám tabulku s těmito daty name descr config1 config2 ahoj textahoj 1 2 nazdar textnazdar 3 4 ...................................................................... .dalších 15000 řádků - probíhá to třeba 10x denně, opravdu potřebuji řešit hlavní problém než to pouštět v noci apod. to mi nepomůže no a tento soubor nebo tabulku to už je jedno, umím si csv nasypat do tabulky, nebo tabulku vytvořit apod., potřebuji nasypat do tří tabulek nejprve vložit do table1 confi1, config2 po vložení se vytvoří id, takže bude v table1 např. 15000 záznamů id config1 config2 891231313 1 2 891231314 5 2 891231315 1 2 891231316 3 2 atd. atd. no a ja potřebuji k těmto id vytvořeným ještě uložit ty name a descr. |
||
Kajman_ Profil * |
#14 · Zasláno: 11. 12. 2007, 23:56:19
vztah 1:1
Proč si tedy neuděláte jednu tabulku. Stačí číst ty tři soubory a vytvářet si jeden insert. (Ale stejně bych to osobně řešil přes více insertů.) |
||
matak Profil |
#15 · Zasláno: 12. 12. 2007, 00:23:39
jak jsem psal tabulek je více a zůstane více, nelze spravovat tabulku o 100 sloupcích a velikosti 100MB, rychlost při 5000 návštěvnících už je pak dost znatelná když se provádí selecty z této tabulky
|
||
Kajman_ Profil * |
#16 · Zasláno: 12. 12. 2007, 09:06:39
Tak si je dejte do pracovní tabulky a z ní to rozházejte do ostatních. Jedním insertem prostě do více tabulek data nedáte.
|
||
Aesir Profil |
#17 · Zasláno: 12. 12. 2007, 09:27:50
matak
mám jednu tabulku a potřebuji z ní přesunout data do 5 jiných tabulek, ve kterých se tyto data vytvářejí a jsou navzájem provázány unikátním id, které ovšem je logicky známé až po vložení do hlavní tabulky a to je problém To přece nemusí být pravda, pokud si exportujete data i s unikátním ID, které je v této počáteční jedné tabulce, provažte data ve třech nebo pěti tabulkách (nebo kolik jich vlastně je) přes toto ID. Tedy exportujte počáteční tabulku do jednoho souboru, ať už cvs nebo xml a ten pak parsujte skriptem řádek po řádku a šoupejte data kam potřebujete, už to navrhuji minimálně potřetí ;) |
||
matak Profil |
#18 · Zasláno: 12. 12. 2007, 13:18:34
no ano chapu takze to je ale zpracovani
15000 radku kazdy po jednom a nejakych ted uz se v tom ztracim 13minut mi to dalo je proste moc, musi se to delat live na live datech a v nejnavstevovanejsich hodinach proste jinak to opravdu nejde data musi byt aktualni a hlavne clovek co to zpravuje proste u toho v noci sedet nebude tohle snad uz objasni o co mi jde: obrázek: sql: http://www.nhlpro.cz/webfaq/insertIntoMoreTables.sql z toho temptable potrebuji nasypat data do tech ostatních tabulek (řeším to jedním způsobem, který sem tady nechtěl říkat abych neodvedl konverzaci jinam, ale je velice neštastný tak se ptám jestli to lze řešit nějak šťastně) |
||
tiso Profil |
#19 · Zasláno: 12. 12. 2007, 13:46:52
Nechápem dôvod takéhoto rozdelenia tabuliek so vzťahom 1:1... Prečo máš 2 indexy (id i Table_01_id) v tabuľkách 2 a 3?
|
||
matak Profil |
#20 · Zasláno: 12. 12. 2007, 13:53:59
už jsem to psal v tomto vláknu,
tabulka má 100 sloupců a 100MB při většině selectů není potřeba procházet celý takto velký soubor, ale je potřeba filtrovat jen v tabulce table1 která po rozdělení má asi 1MB a pak uz si vyberu tabulku kterou joinnu, takze mi pripada prochazet table 1MB a z toho vybrat relevantni radky ktere se joinnou na tabulku o 10MB lepsi nez prochazet cely 100MB soubor nehlede na to ze to proste neustale roste a roste jak do sloupcu tak do velikosti a slibuju si u toho prospech z rozdeleni nehlede na to ze nektere objekty pouzivane v ruznych projektech umi pracovat jen s urcitou tabulkou a zmeny v ni nejsou bohuzel mozne, proto je snadnejsi upravovat tabulky ostatni, neli jedina moznost Ale jak jsem psal tím bych se nezabýval, jde tady o úplně jiný problém, píšu to v každém druhém příspěvku, problém je jinde, tento problém se jistě vyskytne ve více příkladech a situacích |
||
tiso Profil |
#21 · Zasláno: 12. 12. 2007, 14:02:31
matak - aha, prečo nie takto: využiť idtem_table ako index, na tabuľkách 1, 2, 3 zrušiť AUTO_INCREMENT na id a vložiť ich tam priamo, po transakcii obnoviť AUTO_INCREMENT (treba nastaviť hodnotu od ktorej má rátať na MAX(idtemp_table)
|
||
matak Profil |
#22 · Zasláno: 12. 12. 2007, 14:10:04
no to mne napadlo jednak je problem ze
temptable se maze prubezne a znovu plni takze vzdy bude id zacinat od 1 zato ostatni tabulky maji id uz treba na 1000, krom toho se bojim ze uprostred tohoto celeho zpracovani mi tam nekdo neco vlozi a tim posune id, nevim jak je to se zamykanim tabulek na mysql5 a innodb?? jde cist z te tabulky nebo nedela to problem, co kdyz klekne skript, tabulka zustane zamcena??? nekde jsem cetl ze je s tim problem. |
||
matak Profil |
#23 · Zasláno: 12. 12. 2007, 14:11:49
a hlavne bojim se integrity pri takovem zpracovani co kdyz jeden radek se nevlozi?a tim posune vsechna id co se maji vkladat do ostatnbich tabulek
|
||
tiso Profil |
#24 · Zasláno: 12. 12. 2007, 14:18:01
Ty vkladáš záznamy do temp_table a zobrazuješ ich z tabuliek 1, 2, 3? Alebo ako?
|
||
matak Profil |
#25 · Zasláno: 12. 12. 2007, 14:21:45
je to proste pro ilustraci, ta pomocna tabulka da se vytvorit to neni problem, je to tak jak jsem zobrazil na obrazku, v temptable coz je temporary table jsou zaznamy a ty se neustale meni, mazou a pribyvaji, a ja je vzdy jen potrebuji rozsypat do tech tri tabulek
|
||
Kajman_ Profil * |
#26 · Zasláno: 12. 12. 2007, 15:15:56
Myslím, že máte jen dvě varinaty a obě odmítáte...
1. dát to do jedné tabulky (a aplikacím, které vyžadují jen určité sloupečky třeba udělat view s původním názvem) 2. dělat alespoň do první tabulky insert po jednom řádku (což můžete i v uložené proceduře) Možná by ještě šlo přidat do první tabulky pomocný sloupec odkazující se na id z pomocné tabulky a třeba trigger by při insertu takového řádku naopak vložil získané id do pomocného sloupečku v pomocné tabulkce, takže do dalších tabulek by šlo použít klasické insert into... select. |
||
matak Profil |
#27 · Zasláno: 12. 12. 2007, 15:26:33
1. to je současný stav, rychlost dtb je opravdu dramatická
2. to opravdu nechci opět problém s rychlostí 3. popisovaný způsob používám také v jiném smyslu, to jeto řešení co jsem nechtěl říkat, ale moc se mi nelíbí problém je, že nevím jestli je rozumné u tak velké tabulky s 100tky tísíc selectu denně provádět live ALTER TABLE a přidávat pomocný sloupec, je tady ta možnost ho tam nechat což podotkl tiso, ale zase je tady ten problem ze temp tablu je desitky a kazdy ma svoje id, to sem take nechtel rikat protoze uz je to moc slozite, takze dosud vzdy pri hromadnem importu vytvarim temporaryID sloupec a pomoci neho pak uz mohu sypat data do jinych tabulek, v pripade 100 temp tablu bych musel ale vytvorit 100 temporaryID a to se mi take moc nelibi takze problemy 1. za behu pri velice pouzivane tabulce provadet ALTER TABLE nevim jestli je moudre 2. mit 100 parovych sloupcu a mohou rust zase zalezi na adminovi jak se k tomu postavi ale 100 a 200 sloupcu neni neobvykle, nevim jestli je to dobre takto rozsahla tabulka hlavne kdyz ten pocet sloupcu proste nastavuje nekdo z adminu tim ze vytvori novy temp table ktery zpracovava data odjinud, tak nevim uz jsem premyslel i o postgre ale nemam zkusenosti |
||
matak Profil |
#28 · Zasláno: 12. 12. 2007, 15:29:01
proc je 100 temp tablu bych take nerozebiral, jde o ruzne statistiky hokeje z ruznych zdroju, neustale updatovanych apod. vysvetleni by bylo slozitejsi nez cele tohle vlakno, proste tim bych se nezabyval opravdu jsou nutne ty dalsi temptable
|
||
Časová prodleva: 16 let
|
0