MySQL Abfrage funktioniert nicht mehr (Überhang?)
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
abfragen
ausgabe
break
code
datenbank
funktionieren
haken
index
liegen
limit
ordern
see
server
statement
tabelle
tun
url
versuchen
zeit
-
Hallo. Ich kann leider keinen passenderen Titel finden. Folgendes:
Ich habe eine mysql-Abfrage (nicht mysqli) welche nach einem timestamp sortiert Daten ausgibt. Die Tabelle hat 36.822 Datensätze mit zwei ID-Spalten und die vom Timestamp, alle integer. Ich habe nichts geändert, es gibt auch noch ähnliche Tabellen in der Datenbank die immer noch funktionieren. Ich habe die Tabelle exporiert und auf meinem localen Server läuft die Abfrage. Auf meinem online Server aber sind egal an welcher Stelle auf der Seite (es wird mehrfach auf die Tabelle zugegriffen), keine Abfragen mehr möglich. Einträge und Änderungen (INSERT und UPDATE) funktionieren noch. Nach rumprobieren geht die Abfrage noch, wenn ich den ORDER BY Part weglasse. Das einzige was mir aufgefallen ist, ist der Überhang mit 1.9 KiB. Ansonsten habe ich keine Idee mehr. Kann es daran liegen?
Die Abfrage selber ist wohl nicht relevant, weil wie gesagt nichts geändert wurde und sie local noch funktioniert, trotzdem:
SELECT * FROM sc_user_episodes WHERE user_id = '$x' ORDER BY seen DESC LIMIT 1000
Beitrag zuletzt geändert: 9.7.2015 7:19:49 von h4nni -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Und wenn du mal das LIMIT herunter setzt?
Könnte sein, dass deine Anfrage an die Datenbank einfach zu lange dauert. Du musst ja noch bedenken, dass du nur eine gewisse Zeit heisst bis das Script abbricht. Ich meine max_execution_time ist hier auf 60 oder 120. In dieser Zeit muss das Script dann alles abgearbeitet haben. Ist das nicht der Fall, dann bricht der Server das Script ab.
Versuche es mal mit 100 oder etwas weniger. -
OK das hat jetzt echt funktioniert. Ich versuch die Ausgabe mal zu beschreiben: Eine Liste mit den 10 letzten Warengruppen. Die Tabelle enthält die letzten verkauften Waren und wenn mehr als eine Ware die selbe Warengruppe hat, wird dessen Wert in der Ausgabeliste hochgerechnet.
z.B.
Autos 5 Kleidung 3 Essen
Wenn insgesamt 10 Ausgaben gesammelt wurden, wird mit break die Ausgabeschleife abgebrochen. Ich merke aber gerade break macht hier keinen Sinn, da vorher alle Werte schon geprüft werden? Ist das so?
Danke schon mal, lag wohl echt daran. Der Überhang hat nichts damit zu tun?
Beitrag zuletzt geändert: 9.7.2015 11:35:54 von h4nni -
Normalerweise hat der Überhang damit nichts zu tun. Der sagt doch "nur" an, dass deine Tabelle nicht mehr optimal ausbalanciert ist. Wenn bei dir aber extrem viel Überhang ist, dann wird dadurch deine Abfrage langsamer und es ist wahrscheinlicher, dass du in ein Limit läufst.
Den Überhang kannst du außerdem mit 'OPTIMIZE ' beheben. Dann wird die Tabelle wieder ausbalanciert.
Nachlese:
http://selfphp.at/code_snippets/code_snippet.php?id=109
Beitrag zuletzt geändert: 9.7.2015 12:36:48 von javaphp -
Hallo h4nni!
OK, wenn Du das LIMIT reduzierst, dann klappt es also
Dein SQL-Statement mach ja ein "ORDER BY seen".
Hast Du schon mal probehalber einen zusätzlichen Index auf die Tabelle gesetzt, der auf die Spalte "seen" sortiert ist?
Dadruch gewinnst Du wieder deutlich Abfragegeschwindigkeit und Dein SQL-Statement könnte wieder sauber in der limitierten Zeit durchlaufen....
Gruss Dunkeltuten -
Auch ein Umstieg auf PDO kann dir einen Zeitvorteil bringen. Ist allerdings mit Progrmmierarbeit verbunden.
Und eventuell auch die Abfragen optimieren, oft kann man gut mit JOIN's arbeiten anstatt man eine zweite Abfrage in eine Schleife setzt. Was wieder der Vorteil von mysqli wäre, hier kann man keine Abfragen in Schleifen setzen. -
Der Code auf der Seite ist verdammt alt und die Seite recht groß. Der Aufwand das alles umzustellen wäre daher nicht wenig. Ist aber geplant. Ich bin eher im Frontend unterwegs und mein PHP Wissen ist ungefähr aus der Steinzeit, zu Zeiten von schattenbaum.net ... versuche daher auch PHP gerade noch mal von vorne zu lernen (unabhängig von dem Projekt, Onlinekurs), zumindest soweit ich da noch alles verstehe. So viel dazu, hehe
Problem ist leider noch nicht gelöst. Es funktioniert nicht bei jeder Abfrage, meistens dann nicht wenn noch eine zweite auf der Seite auftaucht! Was genau macht ADD INDEX() dunkeltuten? Der Wert von "seen" ist nicht immer einmalig - ist auch mal 0 - Überbleibsel aus anfänglichen Zeiten der Seite. Wäre vielleicht auch für andere Tabellen nützlich, die Seite ist an sich ziemlich langsam ohne AJAX Abfragen.
Bonusfrage: Auf der Seite kann man u.A. Episoden von TV Serien abhaken die man schon gesehen hat. Jeder Haken erstellt einen neuen Datenbankeintrag. Bei 5-8 aktiven Benutzern sind dabei die 36.822 Datensätze entstanden. Fällt euch da spontan eine Möglichkeit ein weniger Datensätze zu erstellen? Bei mehr Benutzern würde die Seite irgendwann nicht mehr laufen. Müsst ihr nicht beantworten. Ich frage nur weil aus meiner nicht-PDO Perspektive mir spontan nichts einfällt.
Beitrag zuletzt geändert: 10.7.2015 18:15:54 von h4nni -
Eventuell läufst du auch in ein Datenbanklimit hier auf lima.
Vorallem wäre es denkbar, wenn du schreibst, dass du 36000 Datensätze erstellst und bei denen einen Haken setzt.
Hast du dir schoneinmal die Fehlermeldungen ausgeben lassen die bei den SQL Abfragen entstehen?
Ich hatte vor einiger Zeit einmal folgendes Problem:
#1226 - User 'USERXXX' has exceeded the 'max_updates' resource (current value: 60000)
Nach einer Supportanfrage wurde mir gesagt, dass auf Lima maximal 60000 Datensatzveränderungen pro Stunde erlaubt sind.
Wenn du jetzt 5-8 User hast zu 36000 Datensätzen, kann es schon sein, dass du auch in das besagte Limit läufst. Besonders dann, wenn der Fehler erst etwas später eintritt.
-
Nee nee, 36.000 Datensätze beinhaltet die Tabelle. Es geht nur um die Abfrage und Auflistung.
Auf meinem Rechner daheim funktioniert die Abfrage. Müsste also am Server liegen (die Seite liegt nicht bei lima-city). -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage