1 rows found. Duration for 1 query: 97,719 sec

Hallöchen :smile:

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

Hallo,
gerade bei Performance-Fragen ist es nicht ganz unerheblich zu wissen, welche Datenbank du eigentlich benutzt!

So wie es aussieht ist es MySQL. Da wäre jetzt interessant

  1. welche Version
  2. Welche Storage Engine

Ganz neben bei: schon mal in der MySQL Doku was über Performance-Optimierungen gelesen? (mysql + performance bei Google ist der Anfang)

Schon mal EXPLAIN (http://dev.mysql.com/doc/refman/5.1/de/explain.html) eingesetzt um zu sehen wie die Abfrage ausgeführt wird?

Ganz allgemein:

  1. Die Struktur der Datenbank sieht suboptimal aus. Ralf wird seine Freude haben :smile: Da muss man zuerst ansetzen.
  2. Lass die Funktionen in den WHERE Klauseln. Deine > und

SELECT VERSION() 5 SELECT ENGINE MyISAM EXPLAIN S
Hallo,

So wie es aussieht ist es MySQL. Da wäre jetzt interessant

  1. welche Version

SELECT VERSION()

5.0.51a-24+lenny5

  1. Welche Storage Engine

SELECT ENGINE
FROM information_schema.TABLES
WHERE
TABLE_NAME = ‚vokabel_tabelle‘

MyISAM

Ganz neben bei: schon mal in der MySQL Doku was über
Performance-Optimierungen gelesen? (mysql + performance bei
Google ist der Anfang)

Hier der Link
http://bit.ly/QH3Oot

Schon mal EXPLAIN
(http://dev.mysql.com/doc/refman/5.1/de/explain.html)
eingesetzt um zu sehen wie die Abfrage ausgeführt wird?

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.

  1. Keine Ahnung ob du Indices hast und welche (es wäre aber
    sinnvoll)

hab ich immer ja.

  1. mit USE INDEX kann man deren Benutzung erzwingen

confused. hmmm.

  1. Outer Joins neigen nicht dazu die Performance zu steigern.
    Zumal du darauf verzichten kannst wenn ich deine Struktur
    richtig interprtiere.

hmmmm.

  1. Der Query-Optimizer von MySQL hat mich das letzte Mal, wo
    ich ihn benutzen musste, zum Wahnsinn getrieben

ohhh. ähhh. Das tut mir leid.

  1. 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.

) Und danke!

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 ?

1 Like

3 mal schneller mit indexe

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 :smile: !! danke !! knutsch :wink:

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

ALTER TABLE vokabel_tabelle ADD INDEX `id_vokab
kleiner rückblick.

also ich lass es so.

vielleicht hab ich jetzt ein paar indexe zuviel, aber wird wohl kaum schaden (?). ich bin happy :smile:

ALTER TABLE vokabel_tabelle
ADD INDEX id_vokabel_tabelle_fach (id_vokabel_tabelle_fach);

ALTER TABLE vokabel_tabelle
ADD INDEX deaktiv (deaktiv);

ALTER TABLE vokabel_tabelle_kasten
ADD INDEX kisten_nr (kisten_nr);

ALTER TABLE vokabel_tabelle_kasten
ADD INDEX id_vokabel_tabelle (id_vokabel_tabelle);

ALTER TABLE vokabel_tabelle_login
ADD INDEX name (name);

ALTER TABLE vokabel_tabelle_kasten
ADD INDEX id_vokabel_tabelle_login (id_vokabel_tabelle_login);

ALTER TABLE vokabel_tabelle_kasten
ADD INDEX deaktiv (deaktiv);

ALTER TABLE vokabel_tabelle_fach
ADD INDEX public (public);

ALTER TABLE vokabel_tabelle_fach
ADD UNIQUE INDEX name (name);

ALTER TABLE vokabel_tabelle_personal_statistik
ADD INDEX id_vokabel (id_vokabel);

zum Dank hier der Link zu Anwendung
http://pilawa.sl5.de/?fach=dict-english-german&abfra…

is quasi sowas wie alpha - version (nennt man glaub ich so)

um dir zu erklären was ein index so macht , sei folgendes beispiel
sinnvoll.

id ArtikelArt
1 Baum
2 Baum
3 Holz
4 Holz
5 Holz
6 Sand
7 Sand
8 Eiche

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.

1 Like

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 .

*possible_keys* sollte nie NULL sein .

hier mal lesen
http://phpperformance.de/mysql-unterstuetzen/

*possible_keys* sollte nie NULL sein .

ups der Artiekl bezieht sich darauf http://phpperformance.de/langsame-mysql-statements-f…