Caching by MySQL
axxxel
- datenbank
0 Ilja
Hi
bei einem insert into t (id,v) select ttt.id,(tt.a+tt.b) from tt,ttt where tt.idx=ttt.idx fällt auf, dass mysql erst versucht, die neuen Einträge _alle_ zu erstellen und dann erst in die Tabelle t schreibt.
Da es sich um sehr(!) viele Datensätze handelt, wäre es besser, wenn dies schrittweise geschehen würde. Also wie:
insert into t (id,v) select ttt.id,(tt.a+tt.b) limit 0,100;
insert into t (id,v) select ttt.id,(tt.a+tt.b) limit 100,200;
usw.
Aber soetwas müsste ja wieder softwareseitig gelöst werden anstatt in dem insert-query.
Kann man MySQL anders beibringen, dass es z.B. immer nach 100 Einträgen die Daten "abschickt" und nicht alles cachet?
THX
yo,
Da es sich um sehr(!) viele Datensätze handelt, wäre es besser, wenn dies schrittweise geschehen würde. Also wie:
was wäre den daran der vorteil oder setzt du nach jedem insert auch ein commit ein ?
Kann man MySQL anders beibringen, dass es z.B. immer nach 100 Einträgen die Daten "abschickt" und nicht alles cachet?
stichwort transaktionen, selbst wenn er das tun würde, wäre dir damit noch nicht geholfen. du musst die tranksaktion mit einem commit abschließen, s.o.
was geht wäre, wenn du aus dem SELECT viele INSERT anweisungen erzeugst, dir also quasi pro Datensatz einen String zusammen setzt, so mache ich das in bestimmten fällen ab und zu. aber auch hier muss wieder ein COMMIT folgen, damit das INSERT auch wirklich wirksam ist.
SELECT 'INSERT INTO tabelle (spalte1) VALUES (''' || tab1.spalte1 || ''');'
FROM tabelle tab1
die dreifachen ' dienen der maskierung, habe als beispiel erst mal eine tabelle genommen.
noch ein hinweis, benutze liber explizite anstelle von impliziten JOINS. also nicht mit komma getrent die tabellen, sondern
SELECT ..
FROM tab1
INNER JOIN tab2 ON tab2.saplte = tab1.spalte
...
Ilja