Какой 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к.
Какой запрос быстрее будет работать? Или нет особо смысла менять одно на другое?
  • Вопрос задан
  • 1140 просмотров
Пригласить эксперта
Ответы на вопрос 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). В таком случае надо блокировать таблицу или строку, чтобы за время проверки не было списания средств другим потоком.
Ответ написан
Ваш ответ на вопрос

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

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