Tach!
die abfrage für die tabelle arbeitskarten ist ok, was mich jedoch wundert, ich habe ja in der tabelle arbeitskarten_zeiten extra einen index auf die refid gesetzt, da ich ja nach dieser oft suche, logisch
Ein Index ist keine Pflichtveranstaltung für das DBMS. MySQL entscheidet von selbst und für jede Abfrage einzeln, ob ein Index nutzbringend verwendet werden kann oder nicht. Ein Index hilft insbesondere, wenn durch ihn die zu durchsuchende Datenmenge signifikant eingeschränkt werden kann. Sind zu wenige Datensätze in der Tabelle oder der gesuchte Wert ist in 99% der Datensätze zu finden, dann bringt ein Index nichts und wird nicht verwendet. Vielleicht helfen andere Indexe besser beim Einschränken, dann nimmt der Optimizer diese. (Meist nimmt er nur einen, aber wenn die Zwischenergebnismenge nach dem erstbesten Index immer noch sehr groß ist, nimmt er durchaus auch noch einen zweiten.)
allerdings: der einzig von mysql als möglich angesehener schlüssel ist "ende"
benutzen tut mysql aber GARKEIN schlüssel
hier könnte ich mir schon als leihe vorstellen, dass das ja nicht so ist, wie es gewollt ist ;)
Ein Laie sollte sich Wissen zulegen und nicht nur leihen :-) Jedenfalls ist so ein Optimizer auch nur ein Mensch und kann sich irren. In dem Fall kann man ihm mit Index-Hints die Verwendung bestimmter Indexe nahelegen.
hast du eine idee wieso das so sein könnte?
Wenn ich so nachdenke, fällt mir ein Grund ein, warum das so sein könnte. Der muss aber nicht unbedingt mit der Realität übereinstimmen, auch wenn er erstmal plausibel klingen mag. Ich kann mir vorstellen, dass MySQL die Subquery als correlated subquery ansieht und sie für jeden Datensatz der äußeren Query neu berechnet. Die Überlegung hilft bei der Lösung aber nur, wenn ich dazu eine Gegenmaßnahme kennen würde. Erfolversprechender stelle ich mit jedoch vor, mal ein paar Umformulierungen des Statements zu probieren.
Joine die arbeitskarten A an die arbeitskarten_zeiten Z über z.refid=a.id und häng die WHERE-Bedingungen der Subquery an die äußere an.
Probier die A.WHERE-Bedingungen zur Join-Bedingung hinzuzufügen (keine Ahnung, ob das sinnvoll ist oder Pluspunkte bringt).
Joine nicht arbeitskarten sondern die Subquery.
Immer schön messen, ob die Versuche was bringen. Wenn nicht müssen wir mal sehen, ob mir oder jemand anderem noch eine weitere Idee einfällt.
dedlfix.