Portál AbcLinuxu, 8. května 2025 21:13

Dotaz: záťaž > mysql MyISAM tab1, tab2, tab3 ... INSERT INTO main_tab

2.1.2012 14:45 dusan456 | skóre: 12 | Poprad
záťaž > mysql MyISAM tab1, tab2, tab3 ... INSERT INTO main_tab
Přečteno: 405×
Odpovědět | Admin
Zdravím,

raz mesačne potrebujem aktualizovať main_tab a vložiť do nej data z iných štrukturou rovnakých tab a to tak, že dám
TRUNCATE TABLE main_tab

INSERT INTO main_tab SELECT * FROM tab1
mysqlcheck -o mojadatabaza main_tab -u root --password=xxxxx
INSERT INTO main_tab SELECT * FROM tab2
mysqlcheck -o mojadatabaza main_tab -u root --password=xxxxx
INSERT INTO main_tab SELECT * FROM tab3
mysqlcheck -o mojadatabaza main_tab -u root --password=xxxxx
...
INSERT INTO main_tab SELECT * FROM tab10
jedna tab má cca. 600 tisíc riadkov a 60MB

Insert prvých 5 tab prebehne v poriadku a potom to už je jedna katastrófa, všetko sa úplne spomali a strašne dlho to trvá, kým sa vložia ostatné tab do main_tab.

Najhoršie je, že pri tom sa odstavý celý web server.

Neviete prosím poradiť, ako by som to mohol vyriešiť?

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (dusan456 (tazatel))
2.1.2012 17:57 jekub
Rozbalit Rozbalit vše Re: záťaž > mysql MyISAM tab1, tab2, tab3 ... INSERT INTO main_tab
Odpovědět | | Sbalit | Link | Blokovat | Admin
Těžko říct. Obecně při takové akci

* zrušit indexy

* zrušit všechna omezení

* import

* obnovit indexy a omezení

Hlavně by vás mělo zajímat, co vlastně to zpomalení způsobuje. Může to být třeba i ten šestý select...

2.1.2012 21:02 dusan456 | skóre: 12 | Poprad
Rozbalit Rozbalit vše Re: záťaž > mysql MyISAM tab1, tab2, tab3 ... INSERT INTO main_tab
Ďakujem za info, vyzerá to tak, že to robili indexy.
Řešení 1× (dusan456 (tazatel))
2.1.2012 21:16 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: záťaž > mysql MyISAM tab1, tab2, tab3 ... INSERT INTO main_tab
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud máte dost místa, tak:
TRUNCATE TABLE main_tab;
DROP INDEX pro_všechny_indexy ON main_tab;

SELECT * FROM tab1 INTO OUTFILE '/path/tab1.txt';
...
SELECT * FROM tabN INTO OUTFILE '/path/tabN.txt';

LOAD DATA INFILE '/path/tab1.txt' INTO TABLE main_tab;
...
LOAD DATA INFILE '/path/tabN.txt' INTO TABLE main_tab;

CREATE INDEX [UNIQUE] pro_všechny_indexy ON main_tab;

…a nezapomenout soubory smazat, obecně to bude asi nejrychlejší.
Sekvenci LOAD DATA INFILE můžete zaměnit za mysqlimport, kde můžete zadat všechny soubory naráz.

PS: A protože se mohou názvy indexů blbě zjišťovat, je snažší místo TRUNCATE + DROP INDEX použít DROP TABLE, CREATE TABLE jen s primárním indexem, nahrnout data a CREATE INDEX pro potřebné indexy.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
5.1.2012 16:38 dusan456 | skóre: 12 | Poprad
Rozbalit Rozbalit vše Re: záťaž > mysql MyISAM tab1, tab2, tab3 ... INSERT INTO main_tab
Veľká vďaka!!!

Ešte možno by bolo dobré nahrnúť dáta najprv do temp_main_tab a:
...
DROP TABLE main_tab;
RENAME TABLE temp_main_tab TO main_tab;
.. ale to už je len taká drobnosť.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.