Explain select ... immer 3693 rows ... komisch

Halole, ich hab gerade mal unter
MySql Explain ausprobiert und war total überrascht,
das meine Abfrage Variation immer gleich viel rows ergab (unten die Ergebnisse).

Meine Vermutung ist folgende:

Schnellster sei:
select * from vokabel_tabelle where frage = „5+5“ Limit 0,1

Dann käme:
explain select distinct * from vokabel_tabelle where frage = „5+5“

Und der langsamste:
explain select distinct * from vokabel_tabelle where frage = „5+5“

Leider liefert mir MySql bei allen drei die gleichen statistischen Daten, mämlich rows 3693.

Ist doch komisch oder?

guten Rutsch und so :smile:
lg w.

Hier die Ergs noch mal vollständig:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE vokabel_tabelle ALL 3693 Using where

explain select * from vokabel_tabelle where frage = „5+5“


explain select distinct * from vokabel_tabelle where frage = „5+5“
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE vokabel_tabelle ALL 3693 Using where


explain select * from vokabel_tabelle where frage = „5+5“ Limit 0,1
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE vokabel_tabelle ALL 3693 Using where

Das bedeutet nur das er 3693 Rows real gescannt hat um dein Ergebniss auszugeben. Vermutlich hast du 3693 Einträge in deiner Datenbank und er muß einfach jedes davon einmal anschauen um sie mit deiner WHERE Bedingung zu vergleichen.

Gruß Lamer

aber bei LIMIT 0,1 ?
Halole, jup, hast wohl recht.

dummerweise trifft die Bedingung (where frage = „5+5“) aber
schon auf den ersten Datensatz zu.
Da (wenn er nicht von hinten anfängt) reicht es doch wenn, er im Falle „… Limit 0,1“, nach dem ersten Datensatz aufhört zu suchen. Alles andere wär doch bisschen dümmlich.

Is doch komisch oder?

Oder vielleicht sollte ich mal einen andernen Client zum MYSQL verwenden.

Grüßles w.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi
Deine MySQL Tabelle weiß aber nicht wo der anfang ist. Daher scannt er die ganze Tabelle durch um zu wissen wo der anfang ist.
Beim Scann erfasst er dann alle einträge und sucht dann den zum Limit 0,1 erfassten Eintrag raus.

Gruß Lamer

Beweis demnächst …
Halole Lamer,
kann mir kaum vorstellen das der MySQL-Parser so dumm implementiert ist (und das es gerade im diesen Fall zufälligerweise der Worst-Case war, d.h. erst das letzte Element war ein Treffe, glaube ich nicht).
Ich denke ich trete demnächst mal den Beweis an, dass es zumindest mit anderen, wie DB2 und PostGree einen deutlichen Unterschied geben wird.

Gruß w.

Hi
Deine MySQL Tabelle weiß aber nicht wo der anfang ist. Daher
scannt er die ganze Tabelle durch um zu wissen wo der anfang
ist.

Hi
Du hast meine Antwort glaub ich nicht verstanden.

Also was passiert wenn du so ein Select absetzt:

Der Parser öffnet die Tabelle, nimmt den ersten Eintrag und parst ihn. Er schaut ob das ein Treffer ist. Sagen wir einfach mal er findet gleich beim ersten einen Treffer. So nun ist die überlegung des Parsers kann ich aufhören oder nicht. Aufhören könnte er wenn er wüsste das das der wirklich erste Eintrag ist. Dies kann er aber nicht mit sicherheit sagen. Da MySQL die Daten in Blöcken abspeichert und wenn daraus einer gelöscht wird z.b. am Anfang so wird er z.B. durch Optimieren oder durch neue Daten die geschrieben werden aufgefüllt. Was heißt es herscht in einer Tabelle die oft beschrieben, gelöscht und geupdatet wird ein heilloses durcheinander. Somit würdest du mit deiner abfrage immer ein unterschiedliches Ergebniss bekommen. Da du weiter keine Kriterien angibst. Darum scannt er die komplette Tabelle. Würdest du ein Indizie auf eine Spalte machen und darüber dann ein Limit angeben hast du garantiert weniger scans in der Tabelle.

Gruß Lamer

interessant
Hi Lamer :smile:
jetzt hab ich dich verstanden.
Obwohl ich es ziemlich spitzfindig von MySql finde,
wenn das MySql tatsächlich so macht, obwohl ich keine Order By angegeben habe.
Bei einer Order By - Klausel hätte ich dies auch von Anfang an so vermutet.

Leider bin ich heute immer noch nicht dazugekommen einmal zu testen wie andere DBs mit dieser Abfrage umgehen.

Das möchte ich aber noch nachreichen.

… Sagen wir einfach
mal er findet gleich beim ersten einen Treffer. So nun ist die
überlegung des Parsers kann ich aufhören oder nicht. Aufhören
könnte er wenn er wüsste das das der wirklich erste Eintrag
ist. Dies kann er aber nicht mit sicherheit sagen.

Wie gesagt, find ich übertrieben für einen
Select dingens From bla Limit 0,1 where col = „blafasel“

lg w.

Hi,
Im Zweifelsfall mal hier schauen: http://dev.mysql.com/doc/refman/5.1/en/limit-optimiz…

Gruss
Joey

Genau … MySql ist doch cleverer

http://dev.mysql.com/doc/refman/5.1/en/limit-optimiz…

If you use LIMIT row_count with ORDER BY, MySQL ends the sorting as soon as it has found the first row_count rows of the sorted result, rather than sorting the entire result.

Im Moment versuch ich mich gerde mit PostgreSQL Explain-Befehl.
Find ich ein bisschen verwirrend. Vielleicht find ich noch ne gute Literatur dazu.
lg w.