Mysql ОБНОВЛЕНИЕ перед первой проверкой при необходимости или просто ОБНОВЛЕНИЕ? - PullRequest
2 голосов
/ 26 мая 2011

Я использую mysql для обновления поля в таблице при выполнении условия ...

Должен ли я сначала выполнить SELECT, чтобы посмотреть, выполнено ли условие, или я просто пытаюсь использовать UPDATE каждый раз, потому что, если условие не выполняется, ничего не происходит.

Чтобы быть конкретным, вот мой ВЫБОР:

SELECT * FROM forum_subscriptions 
WHERE IDTopic=11111 AND IDUser=11111 and status=0

Здесь я проверяю, нахожусь ли я на теме форума 11111 и подписан ли я (ID пользователя 1) на эту тему, и мой статус подписки равен 0 (это означает, что он еще не получил письмо о новом сообщении в теме)

Итак, когда это выполнено, сделайте:

UPDATE forum_subscriptions SET Status=1 where IDTopic=11111 AND IDUser=1

Теперь мне интересно, я всегда делаю выбор здесь, чтобы запросить, подписан ли пользователь на эту тему, и у него есть статус, что он посещал эту тему раньше, поэтому любые новые сообщения не будут вызывать уведомления по электронной почте. Когда он снова посещает страницу, запускается обновление, которое сбрасывает посещение, поэтому любые новые сообщения снова отправляют ему электронное письмо.

Таким образом, выбор делается для каждого пользователя, подписан он или нет, чтобы проверить подписку. Обновление производится только при необходимости.

Лучше просто использовать обновление? Чтобы попытаться обновить на каждой странице, если он не подписан на тему, он не будет ничего обновлять.

Как быстро происходит обновление, которое не дает никаких достоверных данных? Как это сделано внутри, как обновление находит, есть ли запись, выбирает ли и затем обновляет? Если так, то было бы лучше только обновить, потому что я достиг бы того же самого без каких-либо замедлений. Если обновление стоит дороже, чем выбрать, я должен сначала попробовать проверить, а затем обновить при необходимости.

Этот пример - пример из реальной жизни, но логика этого обновления / выбора действительно меня интересует, потому что я нахожу проблемы такого рода чаще.

Thanx

ОБНОВЛЕНИЕ: Спасибо обоим парням, но я не вижу в ваших ссылках, заблокировано ли ОБНОВЛЕНИЕ даже без результатов или нет. Поскольку вы давали разные ответы, я все еще не знаю, что делать.

Таблица подписок действительно не обязательно должна быть myisam, я мог бы изменить ее на InnoDB, потому что мне не нужно ее полнотекстовый. Это хорошее решение, чтобы использовать только обновление и изменить эту маленькую таблицу на Inno? Есть ли у типов таблицы смешивания недостатки?

Ответы [ 2 ]

2 голосов
/ 26 мая 2011

Вы просто делаете обновление, без предыдущего выбора:

UPDATE forum_subscriptions SET Status=1 where IDTopic=11111 AND IDUser=1 

Если условия не выполнены, обновление ничего не даст.
Это обновление очень быстрое , если у вас есть индекс для status и IDtopic и IDuser!
Пустое обновление так же быстро, как и пустое выделение.

Если вы делаете выбор первым, вы просто замедляете процесс без причины.

Если вы хотите узнать, сколько строк обновлено, сделайте

SELECT ROW_COUNT() as rows_affected

После выполнения обновления будет показано 0, если строки не обновлены, или число обновленных строк (или вставлено или удалено, если вы использовали эти операторы) .
Эта функция очень быстрая, потому что она просто должна извлечь одно значение из памяти.

Методы обхода проблем с блокировкой таблицы

Смотрите здесь: http://dev.mysql.com/doc/refman/5.5/en/table-locking.html

1 голос
/ 26 мая 2011

Потенциальным побочным эффектом постоянного вызова UPDATE является блокировка, которую необходимо установить, чтобы гарантировать, что никакое другое соединение не изменяет эти строки.

  • Если таблица MyISAM - aблокировка будет размещаться во всей таблице во время поиска.
  • Если таблица равна InnoDB, блокировки будут размещаться в индексах / пробелах.

из Docs :

Чтение блокировки, UPDATE или DELETE обычно устанавливают блокировки записи для каждой записи индекса, которая сканируется при обработке оператора SQL.Неважно, есть ли в операторе условия WHERE, исключающие строку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...