2012-04-04 14 views
-1

Ich versuche, einen Bericht aus der 20+ Minute Laufzeit zu bekommen, und ich habe den Engpass zu diesem Monster einer MySQL-Abfrage, die 5 Joins und 3 Unterabfragen verwendet, um alle Ergebnisse in einem zurückzuverfolgen Datensatz. Mein großer Engpass scheint bisher zu sein: Tritt der Lagerliste auf der Zahlungstabelle bei, entspricht die stock.id einer payment.stock_id und der payment.type ist dieser Typ und der payment.status ist dieser Status. Ich zerlege das langsam in verschiedene Abfragen und lasse Java entscheiden, welche Datensätze zu behalten und wegzuwerfen sind, aber ich frage mich, ob es in mysql einen effizienten Weg gibt, um einige Ergebnismengen zu erhalten, vielleicht als gespeicherte Tabellen und dann abfragen gegen diese? Einige meiner Ergebnissätze werden ziemlich groß sein, einige hunderttausend Einträge in den schlimmsten Fällen.Effiziente mysql-Abfragen

Vielen Dank im Voraus

+2

Hunderttausende Reihen sind sicherlich nicht klein, aber auch nicht so groß. Unabhängig davon möchten Sie möglicherweise die tatsächliche Abfrage veröffentlichen. –

+1

Ich würde vorschlagen, dass Sie die Abfrage abstimmen. Verwenden Sie [Explain] (http://dev.mysql.com/doc/refman/5.0/de/explain.html), um eine erste Übersicht über die Funktionsweise der Abfrage zu erhalten. Sie können die Notwendigkeit für einige Indizes usw. identifizieren. Die Anwendung dieser Filterung in der Anwendung ist auf lange Sicht oft eine schlechte Idee. – aishwarya

+1

Und Tabelle Definitionen ... – Kieveli

Antwort

0

Sie haben einige Entscheidungen von erstellen materialisierte Ansicht, so dass Sie diese auf einem Zeitintervall ausgeführt werden können, aber Sie werden im Grunde eine Verzögerung Auswirkungen auf die Gültigkeit Ihrer Daten haben. Aber sicher ist schneller.

Zweitens ist Index die verbindenden Spalten.

Subselect sind in der Regel teurer als ein JOIN, also versuchen Sie stattdessen, Ihren Subselect in einen Join einzufügen.

Es gibt eine Menge von SQL-Optimierung Buch da draußen, die es wert ist zu lesen, die sich mit diesen Fragen befasst. Aber ohne Ihre DB oder Schema oder Indizes zu kennen und wie die Joins und Subselects sind. Es ist fast so, als würde man einen Ball in der Dunkelheit fangen.

+0

Danke. So wie die Dinge gerade jetzt sitzen, bin ich so ziemlich der einzige Entwickler, ich habe den Code geerbt, niemand pflegt die Datenbank und ich bezweifle, dass es irgendjemand jemals tun wird. Auch wenn es keine gute langfristige Lösung ist, werde ich die Verarbeitung wahrscheinlich einfach in die App verschieben, weil es vorerst besser läuft. Meine Führung von oben ist fast immer "nur ein Pflaster darauf". – coffeeNjava

+1

Tut mir leid, das zu hören, aber das Setzen von Bandaid bedeutet normalerweise, dass du dir später wieder den Kopf kratzen wirst und fragst, wie man den Bandaid verband. Aber es kommt immer darauf an, Kosten zu fixen und Kosten zu ignorieren. – Churk