Results 1 to 4 of 4

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

  1. #1 Reply With Quote
    Veteran Feuerstern's Avatar
    Join Date
    Sep 2007
    Posts
    594
    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 is offline

  2. #2 Reply With Quote
    Tieftöner  Lookbehind's Avatar
    Join Date
    Dec 2007
    Posts
    14,527
    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 is offline

  3. #3 Reply With Quote
    Pretty Pink Pony Princess  Multithread's Avatar
    Join Date
    Jun 2010
    Location
    Crystal Empire
    Posts
    10,718
    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 is offline

  4. #4 Reply With Quote

    Batmanistrator
    Thoronador's Avatar
    Join Date
    Jul 2005
    Location
    Morrowind, Vvardenfell-Distrikt
    Posts
    18,646
    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 is offline

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •