Ergebnis 1 bis 4 von 4

MySQL, besser eine große oder viele kleine Anfragen?

  1. #1 Zitieren
    Ritter Avatar von Feuerstern
    Registriert seit
    Sep 2007
    Beiträge
    1.798
    Hallo zusammen,
    angenommen ich habe eine Tabelle mit 50 tausend Einträgen und ich muss bei nahezu allen dieser Einträge einen Wert ändern.
    Hier gäbe es jetzt mehrere Wege. Der Übersichtlichste wäre beispielsweise eine Funktion die jedes mal ein "Update" Befehl ausführt.

    Hier ein Beispiel (php, pdo):
    Code:
    function updateStock($db, $productsId, $stock) {
            $sql = "UPDATE 
                products
                SET 
                products_quantity = :products_quantity
                WHERE 
                products_id = :products_id";
            $stmt = $db->prepare($sql);
            $stmt->bindParam(':products_id', $productsId);
            $stmt->bindParam(':products_quantity', $stock);
            $result = $stmt->execute();
            if ($result === false) {
                return false;
            }
            return true;
    }
    Das ganze könnte man jetzt noch über das Prepare Statement optimieren, indem man die Funktion nicht für 50k Einträge neu aufruft, sondern nach dem prepare Aufruf ($db->prepare($sql)) in einer Schleife über alle Daten läuft und dementsprechend die Werte in den gebundenen Variablen $productsId und $stock ändert.

    Alternativ könnte man auch alles in einem riesigen Call machen und Versuchen alle 50k Einträge auf einmal zu Updaten (hab ich so noch nicht ausprobiert).


    Ich bin mit der unoptimierten Variante, bei der updateStock() immer wieder aufgerufen wird, von der Performance her zufrieden und ist im Code so meiner Meinung nach auch am lesbarsten. Ist es trotz allem sinnvoll das ganze zu optimieren? Ich denke da auch an die Auslastung der DB, falls das ganze z.B. Stündlich passiert.
    Feuerstern ist offline

  2. #2 Zitieren
    Tieftöner Avatar von Lookbehind
    Registriert seit
    Dec 2007
    Beiträge
    15.176
    Das kommt darauf an, was da genau wo dran geändert wird.
    Bekommen alle Produkte den gleichen Stock-Wert zugewiesen? Oder sind die für jeden Eintrag individuell?
    Musst du eine Liste an Produkt-IDs übergeben? Oder kannst du z.B. auch mit einer Range arbeiten?

    Wenn du mit einer Range arbeiten kannst, um allen den gleichen Wert zu zu weisen. Dann gäbe es da Optimierungspotential. Sonst eher nicht. Zumindest nicht SQL-Seitig. Ob dein eigentlicher Code schneller läuft, wenn du umpfzig mal die gleiche Funktion aufrufst, oder ob das schneller geht, wenn du in der Funktion eine Schleife baust, das hängt davon ab, was da sonst noch so an Overhead drin hängt. Das kannst du wohl am besten beurteilen.
    Lookbehind ist offline

  3. #3 Zitieren
    Pretty Pink Pony Princess  Avatar von Multithread
    Registriert seit
    Jun 2010
    Ort
    Crystal Empire
    Beiträge
    11.228
    Je nachdem macht es sinn, ca 100-1000 dieser Update Statements mit einem mal an die DB senden. Dadurch hast du weniger DB Roundtripps.
    aka:
    Code:
    Update_DB("
    update Stock set Price=50 where Id=1;
    update stock set Price=53 where Id=2;
    update stock set Price=15 where Id=3;
    ...
    ");
    Sowohl zu grosse anfragen (MB grosse Strings) als auch viele Kleine sind nicht am schnellsten.
    ggf. kannst du noch einige Anfragen Parallel anfragen, da die DB dies meist sehr gut Optimieren kann.
    [Bild: AMD_Threadripper.png] Bei Hardware gibt es keine eigene Meinung, bei Hardware zählen nur die Fakten.


    Probleme mit der Haarpracht? Starres Haar ohne Glanz? TressFX schafft Abhilfe. Ja, TressFX verhilft auch Ihnen zu schönem und Geschmeidigen Haar.
    [Bild: i6tfHoa3ooSEraFH63.png]
    Multithread ist offline

  4. #4 Zitieren

    Batmanistrator
    Avatar von Thoronador
    Registriert seit
    Jul 2005
    Ort
    Morrowind, Vvardenfell-Distrikt
    Beiträge
    20.403
    Letztendlich gibt es nur eine Möglichkeit, um sich Gewissheit zu verschaffen, was am schnellsten ist: Zeiten für verschiedene Varianten messen.

    Abgesehen davon ist bei UPDATE-Anfragen (wie auch bei INSERT) zu beachten, dass ggf. je nach Struktur auch jedes Mal ein Tabellenindex aktualisiert werden muss. Das kann spürbar länger dauern als die eigentliche Änderung an den Daten. (products_quantity klingt jetzt auf den ersten Blick nicht wie etwas, was unbedingt einen Index hat, aber es sei hier trotzdem erwähnt.) Deswegen sieht man bei größeren Datenimports gelegentlich auch sowas, um den Import zu beschleunigen:
    Code:
    ALTER TABLE `table_name` DISABLE KEYS;
    
    -- großer Datenimport hier
    
    ALTER TABLE `table_name` ENABLE KEYS;
    Allerdings funktioniert das wohl nur bei der Storage Engine MyISAM, nicht bei InnoDB.
    Thoronador ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •