Hi there
ich steh grad tierisch auf der leitung und begreif die welt nicht mehr :(
vielleicht könnt ihr mir ja weiter helfen.
wir haben folgenden tatbestand:
- ich habe eine tabelle "tab1" mit 200k rows
- eine weitere tabelle "tab2" mit etwa 100 rows
- ich will alle rows der tab1 updaten, deren id in tab2 vorhanden ist
- das ergebnis vom subselect ist nicht von tab1 abhängig (der subselect müsste nur einmal ausgeführt werden)
- id und id2 sind natürlich im index ;)
und so sieht der update aus: (vereinfachte version)
update tab1 set feld = 1
where id in (select id from tab2 where id2 = 123)
dieser update dauert 200ms - viel zu lange!
ich habe das gefühl dass der subselect für alle 200k rows ausgeführt wird. wieso weiss kein mensch, denn das ergebnis ist immer das selbe. wie soll es auch anders sein wenn es keine verknüpfung zur übergeordenten tabelle gibt.
richtig wäre doch: subselect ausführen und dann mit den id auf tab1 zugreifen. das wäre mindestens faktor 1000 schneller.
ich kanns jetzt grad nicht testen, aber ich wette oracle würds so
machen.
anyway, wie kann ich diesen update optimieren?
eine lösung hät ich schon, aber das ist mir zu unschön:
ich könnte eine temptable füllen und diese im subselect ohne where-bedingung selektieren. dann merkt das kluge mysql nämlich dass es den subselect nur einmal ausführen muss. ^^
ps: meine mysql-version: 5.0.45-community-nt