bei ca. 15000 Datensätzen ist diese Abfrage doch leider ziemlich langsam geworden.
Nun brauche ich ja nur irgeneinen Datensatz von den 15000 und denke es sollte doch ne Möglichkeit geben, die Geschwindigkeit da noch deutlch zu erhöhen.
Mal sehen ob mir dazu noch was einfällt.
Einfach ein Limit 0,1 half jedenfalls nicht.
Übrigens Ergebnis der Abfrage ist nur ein record.
SELECT 1 AS stueck , floor( ABS( (rand()-0.1) ) * count( t1.id ) ) AS start , count( t1.id ) AS count
FROM vokabel_tabelle AS t1
LEFT OUTER JOIN vokabel_tabelle_kasten AS t2
ON t1.id = t2.id_vokabel_tabelle
AND t2.id_vokabel_tabelle_login = 0
LEFT OUTER JOIN vokabel_tabelle_personal_statistik AS t3
ON t1.id = t3.id_vokabel
AND t3.login_name = ‚public‘
WHERE ( t2.kisten_nr IS NULL AND t1.id_vokabel_tabelle_fach = 193 ) OR 1 AND LENGTH(t1.frage) > 0 AND LENGTH(t1.antwort) > 0 AND ( t1.deaktiv
EXPLAIN SELECT 1 AS stueck , floor( ABS( (rand()-0.1) ) * count( t1.id ) ) AS start , count( t1.id ) AS count
FROM vokabel_tabelle AS t1
LEFT OUTER JOIN vokabel_tabelle_kasten AS t2
ON t1.id = t2.id_vokabel_tabelle
AND t2.id_vokabel_tabelle_login = 0
LEFT OUTER JOIN vokabel_tabelle_personal_statistik AS t3
ON t1.id = t3.id_vokabel
AND t3.login_name = ‚public‘
WHERE ( t2.kisten_nr IS NULL AND t1.id_vokabel_tabelle_fach = 193 ) OR 1 AND LENGTH(t1.frage) > 0 AND LENGTH(t1.antwort) > 0 AND ( t1.deaktiv und 0 AND LENGTH(t1.antwort) > 0
= taucht hier aber leider nix.
Keine Ahnung ob du Indices hast und welche (es wäre aber
sinnvoll)
hab ich immer ja.
mit USE INDEX kann man deren Benutzung erzwingen
confused. hmmm.
Outer Joins neigen nicht dazu die Performance zu steigern.
Zumal du darauf verzichten kannst wenn ich deine Struktur
richtig interprtiere.
hmmmm.
Der Query-Optimizer von MySQL hat mich das letzte Mal, wo
ich ihn benutzen musste, zum Wahnsinn getrieben
ohhh. ähhh. Das tut mir leid.
Ohne Tabellenstrukturen wird es sowieso schwierig.
Ich kann ja mal versuchen das ganz konzept ein bisschen ausführlicher zu schildern. Eine Datei kann man hier wohl nicht hochladen. Mal sehen.
paar Sek (unwesentlich) schneller ohne LENGTH > 0
Folgende Zeilen brauche ich nicht unbedingt, haben aber anscheinend auf die Geschwindigkeit kaum einfluss:
LENGTH(t1.frage) > 0
AND LENGTH(t1.antwort) > 0
Folgender Select ist nur geringfügig schneller
98,421 sec. statt 100,932 sec. (schwnkt leicht)
SELECT 1 AS stueck , floor( ABS( (rand()-0.1) ) * count( t1.id ) ) AS start , count( t1.id ) AS count
FROM vokabel_tabelle AS t1
LEFT OUTER JOIN vokabel_tabelle_kasten AS t2
ON t1.id = t2.id_vokabel_tabelle
AND t2.id_vokabel_tabelle_login = 0
LEFT OUTER JOIN vokabel_tabelle_personal_statistik AS t3
ON t1.id = t3.id_vokabel
AND t3.login_name = ‚public‘
WHERE
( t2.kisten_nr IS NULL
AND t1.id_vokabel_tabelle_fach = 193 )
OR
– 1 AND
– LENGTH(t1.frage) > 0
– AND LENGTH(t1.antwort) > 0
– AND
( t1.deaktiv
da fehlen bestimmt indexe ,
sind die id’s alle primary key ?
korrekt die id spalte war und ist primary key.
jetzt habe ich die anderen felder die genutzt werden auch indexe werden lassen und es sind nur noch 33 sekunden (3 mal schneller).
weiss nur noch nicht welcher index typ richtig ist.
hab als typ einfach
key gewählt.
Anhang:
/* 0 rows affected, 1 rows found. Duration for 1 query: 31,980 sec. */
SELECT 1 AS stueck , floor( ABS( (rand()-0.1) ) * count( t1.id ) ) AS start , count( t1.id ) AS count
FROM vokabel_tabelle AS t1
LEFT OUTER JOIN vokabel_tabelle_kasten AS t2
ON t1.id = t2.id_vokabel_tabelle
AND t2.id_vokabel_tabelle_login = 0
LEFT OUTER JOIN vokabel_tabelle_personal_statistik AS t3
ON t1.id = t3.id_vokabel
AND t3.login_name = ‚public‘
WHERE
( t2.kisten_nr IS NULL
AND t1.id_vokabel_tabelle_fach = 193 )
OR
– 1 AND
– LENGTH(t1.frage) > 0
– AND LENGTH(t1.antwort) > 0
– AND
( t1.deaktiv
Duration for 1 query: 0,171 sec.
huch. irgend ein index. hat den rekord gerade eben geknackt.
ich schau mal nach welcher. hab mehrere auf einmal geetzt.
super !! danke !! knutsch
SELECT 1 AS stueck , floor( ABS( (rand()-0.1) ) * count( t1.id ) ) AS start , count( t1.id ) AS count
FROM vokabel_tabelle AS t1
LEFT OUTER JOIN vokabel_tabelle_kasten AS t2
ON t1.id = t2.id_vokabel_tabelle
AND t2.id_vokabel_tabelle_login = 0
LEFT OUTER JOIN vokabel_tabelle_personal_statistik AS t3
ON t1.id = t3.id_vokabel
AND t3.login_name = ‚public‘
WHERE
( t2.kisten_nr IS NULL
AND t1.id_vokabel_tabelle_fach = 193 )
OR
1 AND
LENGTH(t1.frage) > 0
AND LENGTH(t1.antwort) > 0
AND
( t1.deaktiv
Ein Index auf ArtikelArt liefert dann folgende gruppen
Baum = 1,2
Holz = 3,4,5
Sand = 6,7
Eiche = 8
somit sucht man nach 1 von 5 und nicht wie oben 3 von 8
hat man den 1 in 5 gefunden liefert das die ergebnis menge (z.b. bei Holz 3,4,5)
.
Aber ich hab hier 150.000 Datensätze und kein Querry dauert so lange , wenn ja , mach ich was falsch .
Ich würd auch die rand() funktion vielleicht rausnehmen , brauchst du die für alle Datensätze (15.0000) oder erst von dem 1 den du haben willst.
Vieleicht in 2 querry’s aufteilen .
Mit dem ersten nur eine id holen
und dann mit der Id nochmal den querry machen. So da wirklich nur 1 Datensatz gefragt wird.
Wie gesagt, hätte man die Struktur der Tabellen dann wären wir nciht so Blind.
Du kannst auch noch an deinen Where reihenfolgen arbeiten
denn damit stellt du den benutzen index dar der dann benutzt wird.
Machnmal wirkt es wunder etwas andersrum zu machen,damit die anzahl der auszuschliessenden elemente grösser ist .