Skip to content
Advertisement

How to optimize a query with MySQL multi-query?

I need to optimize a script for high performance so the question is how can I add MySQL multi-query to this code?

foreach($multiContent as $htmlContent) {
    $email = urldecode($email['1']);
    $user = $user['1'];

    //store in db
    $db->query("UPDATE eba_users 
                   SET mail = '$email' 
                 WHERE username = '$user'");
    //echo "email is $email and user is $usern";
  }

  //close if ($array_counter % 200
  unset($array_counter);
  unset($data);
}

Advertisement

Answer

If you’re using mysqli or PDO already, you should be using prepared statements for your queries since they are supported. This will also have a slight increase in performance since the entire query doesn’t need to be sent again to the DB server. However the biggest advantage is the increased security that prepared statements provide.

Other than this, try adding an index on username to speed this query up if you haven’t already.

Edit: If you want to do it all in one query, as you seem to suggest, you could also use ON DUPLICATE KEY UPDATE as mentioned as an answer to this question:

INSERT INTO eba_users (`username`, `mail`) 
VALUES 
    ('username1','$email1'),
    ('username2','$email2'),
    ('username3','$email3'),
    ('username4','$email4'),
    ....
    ('usernameN','$emailN'),
ON DUPLICATE KEY UPDATE `mail`=VALUES(mail);

However this may not be as fast as using prepared statements with a regular UPDATE.

Edit2: As requested, here is probably a close approximation of what you should be doing to bind the parameters in mysqli:

if ($stmt = $mysqli->prepare("UPDATE eba_users SET mail= ? WHERE username= ?")) {

    /* loop through array of users */
    foreach ($array as $username => $newemail) {

        /* bind parameters for markers */
        $stmt->bind_param("ss", $newemail, $username);

        /* execute query */
        $stmt->execute();
    }
}

Of course this doesn’t provide any sort of error messages in case this fails. For that, you can look into mysqli::error

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement