Frage

Gibt es einen nennenswerten Unterschied in der Leistung eine SELECT foo, bar, FROM users Abfrage zwischen aufweist, die 500 Zeilen zurückgibt, und 500 SELECT foo, bar, FROM users WHERE id = x Abfragen auf einmal kommt?

In einer PHP-Anwendung Ich schreibe, ich versuche, zwischen einem Schreiben klar, lesbaren Code-Abschnitt zu wählen, die etwa 500 SELECT-Anweisungen erzeugen würden; oder das Schreiben eines in einem dunklen, komplexen Art und Weise, die nur eine SELECT verwenden würde, die 500 Zeilen zurückgibt.

Ich würde den Weg bevorzugen, die klaren, wartbaren Code verwendet, aber ich bin besorgt darüber, dass die Verbindung Overhead für jede der SELECTs wird zu Leistungsproblemen führt.

Hintergrundinfo, falls relevant es ist: 1) Dies ist ein Modul Drupal, codiert in PHP 2) Die Tabellen in Frage kommen nur sehr wenige Einfügungen und Aktualisierungen und werden selten gesperrt 3) SQL-Joins sind nicht möglich, aus Gründen, nicht relevant für die Frage

Danke!

War es hilfreich?

Lösung

Es ist fast immer schneller eine große Charge SELECT und analysiert die Ergebnisse im Anwendungscode zu tun, als eine große Menge an SELECTs für eine Zeile zu tun. Ich würde empfehlen, dass Sie beide implementieren und profilieren sie, though. Immer bestrebt, die Anzahl von Annahmen zu minimieren Sie haben zu machen.

Andere Tipps

Ich würde nicht zu viele Sorgen über die Verbindung Overhead von MySQL-Abfragen, vor allem, wenn Sie die Verbindung zwischen jeder Abfrage nicht schließen. Bedenken Sie, dass, wenn Ihre Abfrage eine temporäre Tabelle erstellt, Sie haben bereits mehr Zeit in der Abfrage ausgegeben, als der Aufwand der Abfrage nahm.

Ich liebe eine komplexe SQL-Abfrage zu tun, persönlich, aber ich festgestellt, dass die Größe der Tabellen, MySQL Query Cache und Abfrageleistung von Abfragen, die Bereichsprüfung tun müssen (auch gegenüber einem Index) alle einen Unterschied machen.

Ich schlage vor, diese:

1) Stellen Sie den einfachen und korrekten Ausgangswert. Ich vermute, dass dies der Ansatz zig-Abfrage ist. Das ist nicht falsch, und sehr wahrscheinlich helfully richtig. Führen Sie es ein paar Mal und sehen Sie Ihre Abfrage-Cache und Anwendungsleistung. Die Möglichkeit, Ihre App wartbar zu halten ist sehr wichtig, vor allem, wenn Sie mit anderen Code-Maintainer arbeiten. Auch, wenn Sie sind wirklich große Tabellen abfragt, werden kleine Abfragen Skalierbarkeit erhalten.

2) -Code der komplexen Abfrage. Vergleichen Sie die Ergebnisse für die Richtigkeit, und dann die Zeit. Verwenden Sie dann ERWARTEN auf der Abfrage, um zu sehen, was die Zeilen abgetastet sind. Ich habe oft festgestellt, dass, wenn ich einen JOIN oder ein WHERE x! = Y, oder eine Bedingung, die eine temporäre Tabelle erstellt, könnte die Abfrageleistung ziemlich schlecht, vor allem, wenn ich in einer Tabelle bin, das immer ist immer aktualisiert. Allerdings habe ich auch festgestellt, dass eine komplexe Abfrage nicht korrekt sein könnte, und auch, dass eine komplexe Abfrage kann leichter brechen als eine Anwendung wächst. Komplexe Abfragen scannen typischerweise größere Gruppen von Zeilen, oft temporäre Tabellen erstellen und using where Scans aufrufen. Je größer die Tabelle, desto teurer wird diese bekommen. Auch Sie könnten Team Überlegungen, wo komplexe Abfragen nicht Ihr Team die Stärken entsprechen.

3) die Ergebnisse mit Ihrem Team.

Komplexe Abfragen sind weniger wahrscheinlich, die MySQL-Query-Cache zu schlagen, und wenn sie groß genug sind, nicht zwischengespeichert werden sie nicht. (Sie wollen den MySQL Query Cache speichern für häufig Abfragen getroffen.) Auch Abfrage aus, Prädikate, die den Index scannen haben nicht so gut tun. (X! = Y, x> y, x SELECT foo, bar FROM users WHERE foo != 'g' and mumble < '360' am Ende Scans zu tun. (Die Kosten für die Abfrage Overhead könnten in diesem Fall vernachlässigbar.)

Kleine Anfragen können oft komplett ohne temporäre Tabellen nur, indem alle Werte aus dem Index bekommen, so lange, wie die Felder Sie die Auswahl und prädizieren auf indiziert. So ist die Abfrageleistung von SELECT foo, bar FROM users WHERE id = x ist wirklich toll (besonders wenn Spalten foo und bar indiziert sind wie, auch bekannt als alter table users add index ix_a ( foo, bar );.)

Weitere gute Möglichkeiten, die Leistung in Ihrer Anwendung zu erhöhen wäre die kleinen Abfrageergebnisse in der Anwendung cachen (falls zutreffend), oder tun Batch-Jobs einer materialisierten Ansicht Abfrage. Bedenken Sie auch Memcached oder einige Funktionen in XCache gefunden.

Es scheint, wie Sie wissen, was die 500 id Werte sind, also warum nicht etwas tun:

// Assuming you have already validated that this array contains only integers
// so there is not risk of SQl injection

$ids = join(',' $arrayOfIds);

$sql = "SELECT `foo`, `bar` FROM `users` WHERE `id` IN ($ids)";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top