Какой sql запрос выполнится быстрее?

Здравствуйте. Есть приложение, стараемся увеличить скорость работы в некоторых разделах. В данный момент у нас используются блокировки для уменьшения баланса людей, но прочитал что можно сделать это без использования блокировки переложив все на mysql написав такой запрос:
update `users` set `balance` = `balance` - 150 where `id` = 54 and `balance` >= 150

С блокировкой же мы сначала блокируем запись, уменьшаем баланс без `balance` >= 150, таким запросом:
update `users` set `balance` = `balance` - 150 where `id` = 54

После уменьшения снимаем блокировку.
Записей в таблице 481к.
Какой запрос быстрее будет работать? Или нет особо смысла менять одно на другое?
  • Вопрос задан
  • 1142 просмотра
Пригласить эксперта
Ответы на вопрос 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
START TRANSACTION;
select * from users where id = 54 FOR UPDATE
//проверка бизнес логики на наличие денег
update `users` set `balance` = `balance` - 150 where `id` = 54;
COMMIT;


Запрос "where `id` = 54 and `balance` >= 150" - опасен.
Innodb лочит не конкретные записи, а диапазоны индексов - при таком запросе в блокировку будут попадать все записи с балансом >= 150, со всеми вытекающими.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Что один запрос, что другой - атомарные (при AUTOCOMMIT = 1) и их выполнение не пересекается с другими запросами. Никакой дополнительной блокировки для них не требуется, скорость запросов, при уникальном `id` будет практически одинаковая.
Блокировка требуется, если вы сначала получаете баланс (SELECT), затем проверяете возможность списания средств, и только потом списываете их (UPDATE). В таком случае надо блокировать таблицу или строку, чтобы за время проверки не было списания средств другим потоком.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы