@Ilya78rus

Как упростить и оптимизирвоать запрос mysql в node.js?

Всем привет.
Имеются запросы в бд с проверкой на актуальность и пополнением баланса. Необходимо оптимизировать запрос, возможно сократив время обработки. Тк иногда запрос даже не обрабатывается. Приложение высоконагруженное и необходима быстрота отработки запроса (ибо одновременно может быть более 1000 таких запросов на пополнение баланса). У самого сделать это не получается, поэтому прошу помощи у вас, выручите пожалуйста

$app.mysql.getConnection(function(err, connection) {
            if(err) {
              self.error('[Balance2] '+ err);
              return;
            }
            connection.query("SELECT * FROM `trade_log` WHERE `tradeId` = ? and `status` = 'send'", offer.tradeofferid, function(err, rows, fields) { //Тут проверка имеется ли такая запись в бд
              if(err) {
                self.error('[Balance3] '+ err);
                return;
              }
              if(typeof rows[0] == "undefined") {
                return;
              }

              connection.query('UPDATE `trade_log` SET status = "success" WHERE tradeId = ?', offer.tradeofferid, function(err, results) { //Если имеется, то ставим статус success
                if(err) {
                  self.error(err);
                  return;
                }

                if(results.affectedRows == 0) {
                  self.debug("NOT UPDATE TRADE OFFER #" + offer.tradeofferid);
                  return;
                }

                connection.query("SELECT * FROM `trade_log` WHERE `tradeId` = ? and `status` = 'success'", offer.tradeofferid, function(err, rows, fields) { //Получаем оставшиеся данные записи
                  if(err) {
                    self.error(err);
                    return;
                  }

                  var sum = rows[0].sum;
                  connection.query('UPDATE `users` SET `balance` = `balance` + ? WHERE steam_id = ?', [sum, offer.steamid_other], function(err, results) { //Пополняем баланс
                    if(err) {
                      self.error(err);
                      return;
                    }

                    if(results.affectedRows == 0) {
                      self.debug("NOT UPDATE USER BALANCE steamid=" + offer.steamid_other + ", sum=" + sum);
                      return;
                    }

                    self.debug("TRADE OFFER #" + offer.tradeofferid + " ОТ: " + offer.steamid_other + " БЫЛ ПОДТВЕРЖДЕН");	  
			$app.io.emit('deposit', {
				steam_id: offer.steamid_other,
				sum: sum,
			});
                  });
                });
              });
            });

            connection.release();
          });
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
UPDATE `trade_log` AS `tl`
  JOIN `users` AS `u` ON `tl`.`tradeId` = ? AND `tl`.`status` = 'send' 
    AND `u`.`steam_id` = `tl`.`steamid_other`
  SET `tl`.`status` = 'success', `u`.`balance` = `u`.`balance` + `tl`.`sum`

P.S. Поправил малость. Сразу не посмотрел, откуда сумма берётся. И не посмотрел ещё, что надо отправлять данные, а значит ещё запрос на выборку придётся сделать
SELECT `steamid_other`, `sum` 
  FROM `trade_log` 
  WHERE `tradeId` = ? AND `status` = 'success'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы