Akdmeh
@Akdmeh
PHP, Yii2, Music

Плохо ли делать update + если нет обновленных полей — insert?

Есть таблица statistic, в ней поля date, id_user, browser, count (к примеру).
При этом используется UNIQUE KEY (date, id_user, browser) (поэтому продублировать значение не получится).
Как я делал раньше - SELECT * FROM statistic WHERE date='...', id_user=..., browser='...'; если запись существует - делал UPDATE `count`=`count`+1 WHERE ...; если нет - INSERT
Но, во-первых, из-за этого идет в два раза больше запросов (что не сильно хорошо для производительности), а во-вторых, в начале суток получалась ситуация, что пока я делал INSERT, другой запрос уже успевал сделать запись и я получал Integrity Constraint ошибки.

Но ведь суть таблицы состоит в том, что UPDATE происходят намного чаще, чем insert, а в SELECT вообще нет критичной необходимости.
Можно ли делать сразу UPDATE `count`=`count`+1 WHERE date='...', id_user=..., browser='...'; и смотреть, если нет задействованных строк (количество affected rows равно нулю), после этого делать INSERT?
Это позволит избавиться от миллионов запросов SELECT.
Пока что не нашел, чем этот способ плохой. Подскажите, в чем я ошибаюсь?

Правда, от integrity constraint это меня не избавляет (придется ловить Exception в PHP-коде, но это уже такое дело), но зато избавляет от SELECT'ов.
Подскажите, какие могут быть недостатки в этом подходе и возможно ли существуют решения по-лучше?

//Да, знаю о ON DUPLICATE KEY UPDATE, но это решение исключительно для MySQL, и в MyISAM при партиционировании блокирует таблицу (если я правильно понял из StackOverflow). При 60-80 хитах в секунду - это не лучшее решение, как мне кажется.
  • Вопрос задан
  • 485 просмотров
Пригласить эксперта
Ответы на вопрос 2
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Зачем выбрали MyISAM если у вас почти всегда запись а не чтение?
Ну вообще по хорошему да, ON DUPLICATE KEY UPDATE, т.к. один запрос явно лучше, чем два (update + insert)
Ответ написан
orlov0562
@orlov0562
I'm cool!
Можно так, как ты описал, а можно INSERT IGNORE и если не было affected rows, тогда UPDATE, это должно избавить от integrity constraint.

Лично я не знаю, чем это может быть плохо.
Ответ написан
Ваш ответ на вопрос

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

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