2016-08-15 2 views
4

Ich hatte kürzlich meine Website auf einen neuen Server verschoben. Ich habe einige grundlegende Python-Skripte mit Zugangsdaten in einer MySQL-Datenbank. Auf dem alten Server hatten wir keine Probleme. Auf dem neuen Server:Python MySQL fragt Zeit ab, wo MySQL Workbench funktioniert

  • MySQL Workbench kann keine Probleme verbinden und führen Sie alle Abfragen
  • die gleichen (SELECT) Abfragen mit Python arbeitet 5% der Zeit und das andere 95% der Zeit, die sie Timeout oder die Verbindung ist verloren während der Abfrage
  • zum Beispiel die Tabelle hat 100000 Zeilen, die Auswahl der gesamten Sache in MySQLWorkbench funktioniert gut. In 3 Sekunden zurückgegeben.
  • in Python die gleiche Abfrage funktioniert nie, wenn LIMIT 2999 die Abfrage funktioniert, aber nur LIMIT 3010 verursacht Zeitüberschreitung.
  • gleicher Effekt beobachtet, wenn das Skript lokal ausgeführt wird oder aus der Ferne

für ein paar Tage zu graben um jetzt, wenn es entweder in einigen Einstellungen der Datenbank vorhanden sind, um herauszufinden, der Datenbankserver, der Server selbst, die verhindern Python (aber nicht MySQLWorkbench) macht seine Arbeit richtig.

die Abfrage und Code, falls sie sind interessant:

query = "SELECT * FROM wordpress.table;" 

conn = MySQLConnection(**mysqlconfig) 
cursor = conn.cursor() 
cursor.execute(query) 
rows = cursor.fetchall() 

ich auf dem Server die Details nicht, aber es hat genug Kraft für MySQL Workbench gut zu funktionieren, kann nur Python nicht zu sein scheint Lage

**** EDIT ****

um zu sehen, ob dieses Problem durch Abfragen der Rückkehr zu viele Daten für python verursacht wurde zur Arbeit gemacht zu handhaben Ich dachte, mit OFFSET und LIMIT eine größere Abfrage in Stücken mit sagen wir 10 Zeilen pro Abfrage durchlaufen.

total_rows = 100000 
interval = 10 
data = [] 

for n in range(0, total_rows/interval): 
    q = "SELECT * FROM wordpress.table LIMIT %s OFFSET %s" % (interval, n * interval) 
    cursor.execute(q) 
    returned = cursor.fetchall() 
    rows = [[i for i in j] for j in list(returned)] 

    for row in rows: 
     data.append(row) 

    print n, len(data) 

Erwartet: dies schnell durch die größere Abfrage in kleinere Stücke funktionieren würde geschieht: Es wird weiter als die 3000 Zeilen auf, bevor stecken geblieben, aber eine Wand nach einigen Iterationen Schlagen endet. Außerdem führt das zehnmalige Ausführen des Skripts nicht dazu, dass n jedes Mal einen anderen Punkt erreicht.

+0

Können Sie die Schätzung Tischgröße? Wenn es gigantisch ist, ist es vernünftig, dass es vorbei ist. Können Sie die Serverprozesse beim Ausführen des Skripts überwachen, kann dies eine Vorstellung davon geben, was falsch läuft. Nehmen Sie eine Zähloperation, um eine Vorstellung von der Anzahl der Zeilen zu erhalten. –

+0

Ich werde eine HTOP-Überwachung versuchen, während es läuft. Die eine Tabelle, die ich verwende, um dieses Problem zu debuggen, ist 100000 Zeilen und ca. 85 MB. – CharlieSmith

Antwort