Maximale Query-Länge einer SQL-Anfrage?

Ich habe folgendes Problem:

Ich habe eine komplexe mySQL-Anfrage (ca. 900 Zeichen), die ich gern mittels mysql_query bearbeitet haben möchte. Leider gerät der mySQL-Service dabei anscheinend in eine Endlos-Schleife und ich muss den Prozess killen.

Das verwirrende an der Sache ist, dass die Query-Anfrage direkt im phpMyAdmin gestellt, nur 20ms in Anspruch nimmt.

Daher meine Frage: Gibt es eine maximale Stringlänge, die man mysql_query übergeben kann?

Danke im Voraus.

Mach mal dies

Öffnen Sie die Konfigurations-Datei Ihres MySQL-Servers und fügen folgende Einträge dazu:

set log_slow_queries=/var/log/slowsql.log
long_query_time=3

Nun werden alle Abfragen, die länger als 3 Sekunden dauern, im genannten File vermerkt. Dort ist dann der SQL-Befehl genau so aufgeführt, wie er an den Server abgesetzt wurde. Das sollte Ihnen einen guten Ansatzpunkt für Optimierungen geben, etwa dem Einsatz einer zusätzlichen Index-Datei zum Beschleunigen der Abfragen.

schickt er wirklich den ganzen sql befehl ??

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

Öffnen Sie die Konfigurations-Datei Ihres MySQL-Servers und
fügen folgende Einträge dazu:

set log_slow_queries=/var/log/slowsql.log
long_query_time=3

(…)

schickt er wirklich den ganzen sql befehl ??

Das hat gut funktioniert. Nun kann ich die Längenbegrenzung ausschließen, denn das komplette Query kommt beim mySQL-Server an.

In dem Logfile müsste zuerst das connect kommen. Aber nichtmal das wird ausgeführt.

Was kann dort schief laufen?

Hallo,

Funktioniert den ein Normales Query wie

SELECT \* FROM `tabelle` LIMIT 0,1

Gibt es beim Aufruf des PHP Scripts eine fehlermeldung?

Gruß
Phillip

Normale Queries funktionieren wunderbar. Eine Fehlermeldung bekomm ich nicht, da das Query in einer Endschlosschleife (max. 10 Minuten hab ich gewartet) endet und somit kein Resultat liefert.

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

Poste doch mal das SQL query was du abschickst.

eine beschränkung für mysql_query gibt es nicht.

PMA macht auch nichts anderes als das Query durch mysql_query zu schicken.

halt nur vorher noch nen bißchen nachbearbeitet.

Gruß
Phillip

SELECT *
FROM forum_posts, user, user_allgemein, flags, user_stats
WHERE forum_posts.forum = 12
AND forum_posts.thema = 123
AND forum_posts.autor = user.id
AND forum_posts.autor = user_allgemein.user_id
AND forum_posts.autor = user_stats.user_id
AND user_allgemein.land = flags.id
ORDER BY forum_posts.time ASC

Ein Syntax-Fehler ist es ja nicht, da wie gesagt PMA die Anfrage blitzschnell ausführt.
Kann man sich denn die nachbearbeite Form des Queries von PMA anzeigen lassen?

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

Also ich sehe da jetzt so auf anhieb kein problem,

wenn du dieses Query durch ein anderes Query ersetzt klappt das script ?
musst du den mysql dienst killen oder den webserver ?

Gruß
Phillip

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

Also ich sehe da jetzt so auf anhieb kein problem,

wenn du dieses Query durch ein anderes Query ersetzt klappt
das script ?
musst du den mysql dienst killen oder den webserver ?

Gruß
Phillip

Ja anderes Queries funktionieren an der Stelle. Ich habe das Query mal aus einer anderen Datei heraus gestartet. Leider das gleiche Ergebnis - die Endlosschleife.
Dann muss ich nur den Dienst killen, da nur der die 100% CPU-Last ausmacht.

welchen dienst ?

mysqld
oder
webserverdienst ?
apache2 o.ä.

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

welchen dienst ?

mysqld
oder
webserverdienst ?
apache2 o.ä.

mysqld

apache2 langweilt sich zu der Zeit tot.

Poste doch mal das SQL query was du abschickst.

eine beschränkung für mysql_query gibt es nicht.

PMA macht auch nichts anderes als das Query durch mysql_query
zu schicken.

halt nur vorher noch nen bißchen nachbearbeitet.

Gruß
Phillip

SELECT *
FROM forum_posts, user, user_allgemein, flags, user_stats
WHERE forum_posts.forum = 12
AND forum_posts.thema = 123
AND forum_posts.autor = user.id
AND forum_posts.autor = user_allgemein.user_id
AND forum_posts.autor = user_stats.user_id
AND user_allgemein.land = flags.id
ORDER BY forum_posts.time ASC

Ein Syntax-Fehler ist es ja nicht,

naja, syntaktisch mag es richtig sein, aber du machst einen join auf 5 tabellen und holst alle spalten aus allen benutzen tabellen (deine ergebnismenge enthaelt dann pro zeile alle spalten aller tabellen und wahrscheinlich alle zeilen mehrfach als karthesische produkt ) und machst dann noch ein order by drauf. muesst eman sich das db-modell anschauen.
mach es doch mal im mysql-client und schau wieviele zeilen/ob zeilen rauskommen.

da wie gesagt PMA die
Anfrage blitzschnell ausführt.

der macht standardmaessig aber auch ein limit.

Kann man sich denn die nachbearbeite Form des Queries von PMA
anzeigen lassen?

wenn du eine aktuelle version hast, und im reiter sql deine query pastest, dann zeigt er die umgeformte query direkt ueber dem ergebnis an.

Hallo,

SELECT *
FROM forum_posts, user, user_allgemein, flags, user_stats
WHERE forum_posts.forum = 12
AND forum_posts.thema = 123
AND forum_posts.autor = user.id
AND forum_posts.autor = user_allgemein.user_id
AND forum_posts.autor = user_stats.user_id
AND user_allgemein.land = flags.id
ORDER BY forum_posts.time ASC

Ein Syntax-Fehler ist es ja nicht, da wie gesagt PMA die
Anfrage blitzschnell ausführt.

PMA setzt da automatisch ein LIMIT ein… kommen da einfach zu viele Zeile zurück ? Bei einem JOIN über 5 Tabellen…
Setze im PMA mal ein EXPLAIN davor und schaue mal, wie der das abarbeitet, oder mache mal ein select count(*)… um zu sehen, wie viele Zeilen da entstehen.

Alexander

PMA setzt da automatisch ein LIMIT ein… kommen da einfach zu
viele Zeile zurück ? Bei einem JOIN über 5 Tabellen…
Setze im PMA mal ein EXPLAIN davor und schaue mal, wie der das
abarbeitet, oder mache mal ein select count(*)… um zu sehen,
wie viele Zeilen da entstehen.

Daran liegt es nicht. Wenn ich die Anfrage über PMA stelle, werden 4 Datensätze zurückgegeben.

Der Tipp mit dem EXPLAIN liefert folgendes:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE user_stats ALL NULL NULL NULL NULL 21622 Using temporary; Using filesort
1 SIMPLE user_allgemein ALL NULL NULL NULL NULL 23011 Using where
1 SIMPLE flags eq_ref PRIMARY PRIMARY 4 user_allgemein.land 1
1 SIMPLE user eq_ref PRIMARY PRIMARY 4 user_allgemein.user_id 1 Using where
1 SIMPLE forum_posts ALL NULL NULL NULL NULL 40411 Using where

Werde leider nicht ganz schlau aus den Werten.

Hallo,

warum das in PMA schneller geht weiss ich leider auch nicht, aber das Explain liefert doch schon einige Daten, warum es länger dauern könnte…

id select_type table type possible_keys key key_len ref
rows Extra
1 SIMPLE user_stats ALL NULL NULL NULL NULL 21622
Using temporary; Using filesort
1 SIMPLE user_allgemein ALL NULL NULL NULL NULL 23011
Using where

Kein Index auf user_id in den beiden Tabellen oder verschiedene Typen zu autor ?

1 SIMPLE flags eq_ref PRIMARY PRIMARY 4
user_allgemein.land 1
1 SIMPLE user eq_ref PRIMARY PRIMARY 4
user_allgemein.user_id 1 Using where

Die beiden sind ok, da hat der primary key gepasst.

1 SIMPLE forum_posts ALL NULL NULL NULL NULL 40411
Using where

Ein Index auf forum,thema könnte hier helfen, das nicht alle Zeilen verglichen werden.

Werde leider nicht ganz schlau aus den Werten.

100%ig kenne ich mich damit auch nicht aus, type=ALL heisst, er muss alle Zeilen vergleichen, rows sind ca. die Anzahl der Zeilen in der jeweiligen Tabelle.
Gibt hier 40000*23000*210000 Zeilen, kein Wunder, das das ewig braucht.

Unter key steht, ob ein Eindex verwendet wurde, und wenn ja welcher.

Das Ganze ist in http://mysql.org/doc/refman/4.1/en/explain.html ausführlicher erklärt.

Was mich jetzt interessieren würde: Unterscheidet sich die Ausgabe in PMA und in deinem Programm :wink:

Alexander

Als Abschluss kurz die Lösung meines Problems:
Ich habe die fehlende Indizes über die passenden Spalten angelegt. Anschließend hatte der Browser kein Problem mehr mit einer blitzschnellen Abfrage.
Warum PMA allerdings auch ohne die Indizes klarkam, bleibt wohl für immer im verborgenen :smile:

Danke an die hilfreichen Hinweise!

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